忽略PHP正则表达式中的url



我有一个实用程序,我试图在一个应用程序中强制执行品牌标准,在该应用程序中,函数将用一个类将品牌词包装在一个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

示例

最新更新