PHP中正则表达式的问题

时间:2015-08-12 19:58:47

标签: php string search replace

(我想让我的用户用他们的名字标记其他用户,问题:当有人再次编辑他的帖子时,他会在他的编辑器中获得链接。当他保存他的编辑时,脚本将破坏旧链接。 。)

我用数组中包含的单词替换大字符串中的所有单词。

$users = {'this', 'car'}
$text = hello, this is <a title="this" href="">a test this</a>
$search = '!\b('.implode('|', $users).')\b!i';
$replace =  '<a target="_blank" alt="$1" href="/user/$1">$1</a>';
$text = preg_replace($search, $replace, $text);

正如您在上面所看到的,我尝试替换这个&#39;和&#39; car&#39;在$ text with

<a target="_blank" alt="$1" href="/user/$1">$1</a>
问题是,我的脚本在我的链接中也取代了这个&#39;

<a title="this" href="">this</a>

我不完全确定,但我想,你知道我的意思。 所以我的剧本破坏了我的链接...

我不需要检测,如果单词是在html元素中,因为它应该能够替换其他标签中的单词,如h1或p ......

我需要类似的内容 一个模式,只有匹配,当单词看起来像: &#34;这个&#34; &#34;这个,&#34; &#34;,这个&#34; &#34;这个:&#34; ... (没问题,如果我必须手动设置这些......)

另一个很棒的解决方案:一个字符串,我可以在其中设置不允许的html标记。

$ tags =&#39; a,e,article&#39;;

迎接

1 个答案:

答案 0 :(得分:0)

这应该这样做

<.*?this.*?>(*SKIP)(*FAIL)|\b(this)\b

演示:https://regex101.com/r/fX0pT1/1

有关此正则表达式方法的更多信息,http://www.rexegg.com/regex-best-trick.html

PHP用法:

$users = array('this', 'car');
$text = 'hello, this is <a title="this" href="">a test this</a>';
$terms = '(' . implode('|', $users) . ')';
$search = '!<.*?'.$terms.'.*?>(*SKIP)(*FAIL)|\b(' . $terms . ')\b!i';
echo $search;
$replace =  '<a target="_blank" alt="$2" href="/user/$2">$2</a>';
echo preg_replace($search, $replace, $text);

输出:

hello, <a target="_blank" alt="" href="/user/this">this</a> is <a title="this" href="">a test <a target="_blank" alt="" href="/user/this">this</a></a>

PHP演示:https://eval.in/415964

...或者如果您只想要链接,https://regex101.com/r/fX0pT1/2<a.*?this.*?>(*SKIP)(*FAIL)|\b(this)\b