php - строка preg_match вне атрибута href - PullRequest
0 голосов
/ 17 сентября 2010

Я нахожу регулярное выражение запутанным, поэтому я застрял с этой проблемой:

Мне нужно вставить <b> теги для определенных ключевых слов в данном тексте.проблема в том, что если ключевое слово находится в атрибуте href, это приведет к неработающей ссылке.

код выглядит так:

$text = preg_replace('/(\b'.$keyword.'\b)/i','<b>\1</b>',$text);

, поэтому для случаев, таких как

this <a href="keyword.php">keyword</a> here

Я получаю:

this <a href="<b>keyword</b>.php"><b>keyword</b></a> here

Я перепробовал все виды комбинаций, но все еще не мог получить правильный шаблон.

спасибо!

Ответы [ 3 ]

4 голосов
/ 17 сентября 2010

Вы не можете использовать Regex только для этого. Они мощные, но не могут анализировать рекурсивную грамматику, такую ​​как HTML.

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

Если ваш HTML является действительным XHTML, вы можете использовать функцию xml_parse. если это не так, используйте любой доступный HTML-парсер.

0 голосов
/ 17 сентября 2010

Да, вы можете использовать регулярные выражения подобным образом, но код может стать немного запутанным.Вот краткий пример

$string  = '<a href="keyword.php">link text with keyword and stuff</a>';
$keyword = 'keyword';
$text    = preg_replace(
               '/(<a href=")('.$keyword.')(.php">)(.*)(<\/a>)/', 
               "$1$2$3<b>$4</b>$5", 
               $string
           );

echo $string."\n";
echo $text."\n";

Содержимое inside () хранится в переменных $ 1, $ 2 ... $ n, поэтому мне не нужно снова набирать вещи.Сопоставление также может быть сделано более общим, чтобы соответствовать различным видам синтаксиса URL, если это необходимо.

Видя это решение, вы, возможно, захотите переосмыслить то, как вы планируете сопоставлять ключевые слова в своем коде.:)

вывод:

<a href="keyword.php">link text with keyword and stuff</a>
<a href="keyword.php"><b>link text with keyword and stuff</b></a>
0 голосов
/ 17 сентября 2010

Вы можете снова использовать preg_replace после первой замены, чтобы удалить теги b из href:

$text=preg_replace('#(href="[^"]*)<b>([^"]*)</b>#i',"$1$2",$text);
...