|
|
|
| Необходимо заменить слово на ссылку, естественно, если оно уже не находится внутри ссылки.
С помощью утверждений (?<!) и (?!) не получается учесть ни мусор, который может быть с искомым текстом, ни атрибутов ссылки:
(?<!\<a\>) SOME_TEXT (?!\<\/a\>)
|
Мусор можно учесть с помощью символьного типа \W:
(^|[\W]+)SOME_TEXT($|[\W]+)
|
Но объединить их не получается.
Исходник тестов:
$p = 'text';
echo '<h2>Замена слова на ссылку с помощью утверждений</h2>';
$test[] = '<a> text ';
$test[] = '<a> text ';
$test[] = '</a> text ';
$test[] = ' text <a>';
$test[] = ' text </a>';
$test[] = '<a> text </a>';
$test[] = ' text <a> text';
$test[] = '<a> text </a> text ';
foreach ($test as $key => $val) {
echo preg_replace('/(?<!\<a\>) ('.$p.') (?!\<\/a\>)/', '<a href="">$1</a>', $val).'<br />'."\r\n";
}
unset($test);
echo '<h1>Замена слова на ссылку с учетом мусора</h1>';
$test[] = 'textffdd text';
$test[] = 'text textEFff';
$test[] = '.text,';
$test[] = '<a href=""> fds text.. </a> //\text"""';
$test[] = '!text<';
$test[] = '<a href="">text</a>2""/\text';
foreach ($test as $key => $val) {
echo preg_replace('/(^|[\W]+)('.$p.')($|[\W]+)/', '$1<a href="/">$2</a>$3', $val).'<br />'."\r\n";
}
|
| |
|
|
|
|
|
|
|
для: AleksNN
(11.08.2010 в 12:59)
| | Можешь попробовать вот эту регулярку. Для двух случаев работает, как и твои варианты каждый по отдельности..
<?php
echo preg_replace('/(?<![\w\d]|<a>\040)('.$p.')(?![\w\d]|\040<\/a>)/','<a href="">$1</a>', $val).'<br />'."\r\n";
|
| |
|
|
|