我有一个实用程序,我试图在一个应用程序中强制执行品牌标准,在该应用程序中,函数将用一个类将品牌词包装在一个span中。
public function filterBrandWords($text)
{
// look up the brand words from the config settings
$filter_terms = ['brandword1', 'brandword2', 'brandword3'];
$filtered_text = $text;
foreach ($filter_terms as $word) {
$match_count = preg_match_all('/' . $word . '/i', $text, $matches);
for ($i = 0; $i < $match_count; $i++) {
$brand_string = trim($matches[0][$i]);
$lower = strtolower($brand_string);
$new = '<span class="font-semibold">' . substr($lower, 0, 3) . '</span>' . substr($lower, 3);
$filtered_text = preg_replace('/b' . $brand_string . 'b/', $new, $filtered_text);
}
}
return $filtered_text;
}
这是有效的,但注意到它还过滤了应用时包含品牌URL的文本。
我尝试将$match_count = preg_match_all('/' . $word . '/i', $text, $matches);
修改为$match_count = preg_match_all('/' . $word . 'com$' . '/i', $text, $matches);
,希望它能忽略其中带有com的匹配。
我这里的正则表达式出了什么问题?
如果我做
echo filterBrandWords('brandword1');
输出是
<span class="font-semibold">bra</span>ndword1
使用URL,输出为
<span class="font-semibold">bra</span>ndword1.com
在这些情况下,我想忽略过滤器,直接给出它。
如果你想忽略像URL这样的东西,你可以使用这样的东西作为你的正则表达式:
(?|.*.(com|net|org))
这是一个与URL(广义上(匹配的否定前瞻断言。正如我在这里所做的那样,将其插入到您的函数中:
function filterBrandWords($text)
{
// look up the brand words from the config settings
$filter_terms = ['brandword1', 'brandword2', 'brandword3'];
$filtered_text = $text;
if(!preg_match('/(?|.*.(com|net|org))/', $filtered_text)) { // if it resembles a URL, skip it
foreach ($filter_terms as $word) {
$match_count = preg_match_all('/' . $word . '/i', $text, $matches);
for ($i = 0; $i < $match_count; $i++) {
$brand_string = trim($matches[0][$i]);
$lower = strtolower($brand_string);
$new = '<span class="font-semibold">' . substr($lower, 0, 3) . '</span>' . substr($lower, 3);
$filtered_text = preg_replace('/b' . $brand_string . 'b/', $new, $filtered_text);
}
}
}
return $filtered_text;
}
现在用类似URL的东西调用函数:
echo filterBrandWords('brandword1.com');
整个URL刚刚返回:
brandword1.com
示例