【发布时间】:2015-11-10 23:46:21
【问题描述】:
我有以下代码:
//Array filled with data from external file
$patterns = array('!test!', 'stuff1', 'all!!', '');
//Delete empty values in array
$patterns = array_filter($patterns);
foreach($patterns as &$item){
$item = preg_quote($item);
}
$pattern = '/(\b|^|- |--|-)(?:'.implode('|', $patterns).')(-|--| -|\b|$)/i';
$clid = "I am the !test! stuff1 all!! string";
echo $clid;
$clid = trim(preg_replace($pattern, ' ', $clid));
echo $clid;
输出:
//I am the !test! stuff1 all!! string
//I am the !test! all!! string
我用preg_quote 转义!,那为什么?
我遇到了第二个问题,现在已经解决了,但我不知道为什么会这样。
假设$clid = "I am Jörg Müller with special chars"。如果我删除代码行$patterns = array_filter($patterns);,那么preg_replace 之后的输出是I am J。我不知道为什么,但我用array_filter 解决了这个问题。
谢谢
【问题讨论】:
-
!不是单词字符,所以\b不会在" !"之间匹配 -
有问题!我该如何解决这个问题?是否有“更通用”的
\b,其中还包括!和这类字符 -
可能是前导
(?<!\w),以检查它前面没有单词字符,而对于尾随:(?!\w) -
您能更好地解释一下您的意思吗?我应该在哪里插入这些模式?
标签: php regex preg-replace preg-match preg-quote