У меня есть регулярное выражение, которое просматривает содержимое html для некоторых ключевых слов, которые раньше работали, но теперь терпит неудачу, и я не понимаю, почему. (Регулярное выражение появилось из этого потока .)
$find = '/(?![^<]+>)(?<!\w)(' . preg_quote($t['label']) . ')\b/s'; $text = preg_replace_callback($find, 'replaceCallback', $text); function replaceCallback($match) { if (is_array($match)) { $htmlVersion = $match[1]; $urlVersion = urlencode($htmlVersion); return '<a class="tag" rel="tag-definition" title="Click to know more about ' . $htmlVersion . '" href="?tag=' . $urlVersion . '">' . $htmlVersion . '</a>'; } return $match; }
Сообщение об ошибке указывает на вызов preg_replace_Callback и говорит:
Warning: preg_replace_callback() [function.preg-replace-callback]: Unknown modifier 't' in /frontend.functions.php on line 43
Обратите внимание : это не попытка предоставить исправление для регулярного выражения. Здесь просто показать, насколько сложно (смею сказать, невозможно) создать регулярное выражение, которое успешно проанализирует HTML. Даже хорошо структурированный XHTML был бы кошмарно сложным, но плохо структурированный HTML-код не требует регулярных выражений.
Я согласен на 100%, что использование регулярных выражений для попытки разбора HTML – очень плохая идея. Следующий код использует предоставленную функцию для анализа некоторых простых тегов HTML. Он выполняет вторую попытку, когда находит вложенный тег HTML <em>Test<em>
:
$t['label'] = 'Test'; $text = '<p>Test</p>'; $find = '/(?![^<]+>)(?<!\w)(' . preg_quote($t['label']) . ')\b/s'; $text = preg_replace_callback($find, 'replaceCallback', $text); echo "Find: $find\n"; echo 'Quote: ' . preg_quote($t['label']) . "\n"; echo "Result: $text\n"; /* Returns: Find: /(?![^<]+>)(?<!\w)(Test)\b/s Quote: Test Result: <p><a class="tag" rel="tag-definition" title="Click to know more about Test" href="?tag=Test">Test</a></p> */ $t['label'] = '<em>Test</em>'; $text = '<p>Test</p>'; $find = '/(?![^<]+>)(?<!\w)(' . preg_quote($t['label']) . ')\b/s'; $text = preg_replace_callback($find, 'replaceCallback', $text); echo "Find: $find\n"; echo 'Quote: ' . preg_quote($t['label']) . "\n"; echo "Result: $text\n"; /* Returns: Find: /(?![^<]+>)(?<!\w)(Test)\b/s Quote: Test Result: <p><a class="tag" rel="tag-definition" title="Click to know more about Test" href="?tag=Test">Test</a></p> Warning: preg_replace_callback() [function.preg-replace-callback]: Unknown modifier '\' in /test.php on line 25 Find: /(?![^<]+>)(?<!\w)(\<em\>Test\</em\>)\b/s Quote: \<em\>Test\</em\> Result: */ function replaceCallback($match) { if (is_array($match)) { $htmlVersion = $match[1]; $urlVersion = urlencode($htmlVersion); return '<a class="tag" rel="tag-definition" title="Click to know more about ' . $htmlVersion . '" href="?tag=' . $urlVersion . '">' . $htmlVersion . '</a>'; } return $match; }