복붙노트

html 태그 외부에서 일치하는 PHP 정규식

PHP

html 태그 외부에서 일치하는 PHP 정규식

html 페이지에서 preg_replace를 만들고 있습니다. 내 패턴은 html의 일부 단어에 주변 태그를 추가하는 것을 목표로합니다. 그러나 때로는 내 정규식이 html 태그를 수정합니다. 예를 들어,이 텍스트를 바꿀 때 :

<a href="example.com" alt="yasar home page">yasar</a>

yasar가 yasar 를 읽도록하기 위해서, 나의 정규식은 앵커 태그의 alt 속성에서 yasar를 대체합니다. 현재 preg_replace () 다음과 같이 사용하고 있습니다 :

preg_replace("/(asf|gfd|oyws)/", '<span class=something>${1}</span>',$target);

html 태그 안의 어떤 것과도 일치하지 않도록 정규식을 만들려면 어떻게해야합니까?

해결법

  1. ==============================

    1.어설 션을 사용할 수 있습니다. 검색된 단어가> 또는 임의의 <뒤에 오는 단어를 포함하도록해야하기 때문입니다. Lookahead 어서션은 가변 길이가 될 수 있으므로 후자의 테스트는 더 쉽게 수행 할 수 있습니다.

    어설 션을 사용할 수 있습니다. 검색된 단어가> 또는 임의의 <뒤에 오는 단어를 포함하도록해야하기 때문입니다. Lookahead 어서션은 가변 길이가 될 수 있으므로 후자의 테스트는 더 쉽게 수행 할 수 있습니다.

    /(asf|foo|barr)(?=[^>]*(<|$))/
    

    그 어설 션 구문에 대한 좋은 설명은 http://www.regular-expressions.info/lookaround.html을 참고하십시오.

  2. ==============================

    2.Yasar, 언급되지 않은 또 다른 해결책이 있었기 때문에이 질문을 부활 시켰습니다.

    Yasar, 언급되지 않은 또 다른 해결책이 있었기 때문에이 질문을 부활 시켰습니다.

    다음 태그 문자가 시작 태그인지 확인하는 대신이 솔루션은 모든 <전체 태그>를 건너 뜁니다.

    html을 파싱하기 위해 정규 표현식을 사용하는 것에 대한 모든 면책 조항과 함께, 다음은 정규식입니다.

    <[^>]*>(*SKIP)(*F)|word1|word2|word3
    

    여기에 데모가 있습니다. 코드에서는 다음과 같이 보입니다.

    $target = "word1 <a skip this word2 >word2 again</a> word3";
    $regex = "~<[^>]*>(*SKIP)(*F)|word1|word2|word3~";
    $repl= '<span class="">\0</span>';
    $new=preg_replace($regex,$repl,$target);
    echo htmlentities($new);
    

    다음은이 코드의 온라인 데모입니다.

    참고

  3. ==============================

    3.이것은 당신이 겪은 일과 같은 것일 수 있습니다 : http://snipplr.com/view/3618/ 일반적으로 나는 그러한 것에 반대 할 것을 권합니다. 더 나은 대안은 모든 HTML 태그를 제거하고 다음과 같이 BBcode에 의존하는 것입니다.

    이것은 당신이 겪은 일과 같은 것일 수 있습니다 : http://snipplr.com/view/3618/ 일반적으로 나는 그러한 것에 반대 할 것을 권합니다. 더 나은 대안은 모든 HTML 태그를 제거하고 다음과 같이 BBcode에 의존하는 것입니다.

    [b]bold text[b] [i]italic text[i]
    

    그러나 이것이 당신이하려는 일과 잘 작동하지 않을지도 모른다는 점에 감사드립니다.

    또 다른 옵션은 HTML Purifier입니다. http://htmlpurifier.org/

  4. ==============================

    4.내 마음의 정상에서,이 일을해야합니다 :

    내 마음의 정상에서,이 일을해야합니다 :

    echo preg_replace("/<(.*)>(.*)<\/(.*)>/i","<$1><span class=\"some-class\">$2</span></$3>",$target);
    

    그러나 나는 이것이 얼마나 안전 할 것인지 모른다. 나는 단지 가능성을 제시하고있다 :)

  5. from https://stackoverflow.com/questions/7891771/php-regex-to-match-outside-of-html-tags by cc-by-sa and MIT license