【发布时间】:2012-05-22 16:55:47
【问题描述】:
我正在使用我找到的 here 的正则表达式替换一些文本。
$items = array(
':)' => 'smile',
':(' => 'sad',
'=))' => 'laugh',
':p' => 'tongue',
);
foreach($items as $key => $class)
$regex[] = preg_quote($key, '#');
$regex = '#(?!<\w)('.implode('|', $regex).')(?!\w)#';
$string = preg_replace_callback($regex, function($matches) use($items){
if(isset($items[$matches[0]]))
return '<span class="'.$items[$matches[0]].'">'.$matches[0].'</span>';
return $matches[0];
}, $string);
它可以工作,但如何忽略 HTML 标签定义中的匹配项(如标签属性中)?
例如:
$string = 'Hello :) <a title="Hello :)"> Bye :( </a>';
=> 第二个:) 应该被忽略。
【问题讨论】:
-
简单的答案,就像每次涉及到 HTML 解析一样,是:不要使用正则表达式。
-
但是 PHP 没有任何好的 HTML 解析器 :( 有 DOM 扩展,但让我们面对现实吧,它很烂..
-
@Alex 等等。呜???你认为DOMDocument?很烂,但你使用的是正则表达式?
-
@Alex 你决定使用正则表达式来解决问题。现在你有 2 个问题。
-
PHP DOMDocument 可以满足您的需求。 SearchStackOverflow 相关问题,或阅读文档。编辑:您说 DOMDocument 很烂,但是(尝试)使用 RegEx 来解决您的问题。对不起,我不能再帮你了。开发人员的好坏取决于他(或她)使用和理解的工具。