это должно быть легко, но почему-то я не могу понять это:
У меня есть фрагмент HTML, как этот:
<p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...
Мне нужно сопоставить номера 1, 20, 30 (только те) и заменить их ссылками.
Очевидно, я не хочу заменять числа внутри тега
Вывод должен быть:
<p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some <a href="#20">20</a> text <a href="#1">1</a> <b><a href="#30">30</a></b> with some numbers <a href="#30">30</a> <a href="#20">20</a></p> ...
Вот что у меня есть:
$text = '<p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...';
$pat[] = '/(?<=\>)([^<]*)([^0-9\:])(1|20|30)([^0-9])/s';
$repl[] = '$1$2<a href="#$3" class="p2">$3</a>$4';
echo preg_replace($pat, $repl, $text);
Это работает, но соответствует только одному числу за раз, и я не хочу запускать его в цикле.
Есть идеи?
-
Я вижу смысл в использовании HTML-парсера, однако это похоже на то, что можно сделать с помощью регулярного выражения. Особенно, когда нет стандартной библиотеки для разбора HTML в PHP, и я не уверен, хочу ли я импортировать сторонний анализатор HTML только для этой задачи.
Любая попытка исправить мое регулярное выражение?
-
Мне удалось написать регулярное выражение, которое работает в моем случае. Если кому-то интересно:
$pat[] = '/>(([^<]*)(([^0-9\:]))|())(1|20|30)(?(?=[<]+?)(?!<\/a>)|(([^0-9\<])([^<]*)<(?!\/a>)))/sU';
$repl[] = '>$1<a href="#$6" class="p22">$6</a>$7';
Я очень хорошо знаю, что это легко сделать с помощью HTML-парсера, но я не хочу включать сторонние парсеры в мое программное обеспечение.
С уважением,
Филий