Regex для замены текста только тогда, когда происходит за пределами двух строк? - PullRequest
1 голос
/ 19 ноября 2008

Я хотел бы заменить "& gt" на ">" и "& lt" на "<", но только если они встречаются вне "<pre>" and "". Возможно ли это?

$newText = preg_replace('&gt', '>', $text);

Я бы использовал preg_replace в PHP, как указано выше.

Ответы [ 3 ]

3 голосов
/ 19 ноября 2008

Это не совсем ответ, потому что вы попросили регулярное выражение, но я просто написал очень грязную функцию для этого:

<code><?php

$html = ' <pre>hello &gt; &lt;
& GT; & Lt;
 ';


function stringReplaceThing ($ str) {
    $ offset = 0;
    $ num = 0;
    $ preContents = array ();
    $ length = strlen ($ str);

    // копировать строку, чтобы сохранить смещения / позиции в первой строке после замены
    $ Str2 = $ ул;

    // получить следующую позицию 
tag
    while (false !== ($startPos = stripos($str, '<pre>', $offset))) {
        //the end of the opening <pre> tag
        $startPos += 5;

        //try to get closing tag
        $endPos = stripos($str, '
', $ startPos); if ($ endPos === false) { die ('незакрытый пред тег ..') } $ stringWithinPreTags = substr ($ str, $ startPos, $ endPos - $ startPos); // заменить строку внутри тега каким-то токеном if (strlen ($ stringWithinPreTags)) { $ token = "!! T {$ num} !!"; $ str2 = str_replace ($ stringWithinPreTags, $ token, $ str2); $ preContents [$ token] = $ stringWithinPreTags; $ Num ++; } $ offset = $ endPos + 5; } // сделать фактическую замену $ str2 = str_replace (array ('& gt;', '& lt;'), array ('>', '<'), $ str2); // вернуть содержимое блоков <pre> обратно $ str2 = str_replace (array_keys ($ preContents), array_values ​​($ preContents), $ str2); вернуть $ str2; } print stringReplaceThing ($ html);
2 голосов
/ 20 ноября 2008

Если вы хотите сделать это с регулярным выражением, хитрость заключается в том, чтобы заставить ваше регулярное выражение соответствовать вещам, которые вы не хотите заменять, а также вещам, которые вы хотите заменить, и динамически вычислять замену в зависимости от того, что было найдено .

<code>$new_text = preg_replace_callback('%&lt;|&gt;|<pre>.*?
% si ', compute_replacement, $ text); function compute_replacement ($ groups) { if ($ groups [0] == '& lt;') { вернуть '<'; } elseif ($ groups [1] == '& gt;') { return '>'; } еще { вернуть $ groups [0]; } }
0 голосов
/ 19 ноября 2008

Я не уверен, что обработчик регулярных выражений в PHP делает отрицательные обходные пути, но это то, что вас интересует. Регулярное выражение в других языках будет выглядеть примерно так:

/(?<!(<pre>[^(<\/pre>)]*))XXX(?!(.*<\/pre>))/

(вдыхать - я думаю У меня есть это право)

где XXX - ваш шаблон "<" или ">"

пь. скорее всего, есть еще более простой шаблон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...