首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP正则表达式:排除href锚定标记

PHP正则表达式:排除href锚定标记
EN

Stack Overflow用户
提问于 2011-04-24 06:44:45
回答 3查看 2.1K关注 0票数 6

我正在为我的应用程序创建一个简单的搜索。

我使用PHP正则表达式替换(preg_replace)来查找搜索项(不区分大小写),并在搜索项周围添加<strong>标记。

preg_replace('/'.$query.'/i', '<strong>$0</strong>', $content);

现在我在正则表达式方面并不是最棒的。那么,为了不替换锚标记的href中的搜索项,我应该在正则表达式中添加什么?

这样,如果有人搜索"info“,它不会更改指向”http://something.com/this_`info‘/index.html“的链接。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-24 13:50:49

我相信您将需要条件子模式]来实现此目的:

代码语言:javascript
复制
$query = "link";
$query = preg_quote($query, '/');

$p = '/((<)(?(2)[^>]*>)(?:.*?))*?(' . $query . ')/smi';
$r = "$1<strong>$3</strong>";

$str = '<a href="/Link/foo/the_link.htm">'."\n".'A Link</a>'; // multi-line text
$nstr = preg_replace($p, $r,  $str);
var_dump( $nstr );

$str = 'Its not a Link'; // non-link text
$nstr = preg_replace($p, $r,  $str);
var_dump( $nstr );

输出:(查看源代码)

代码语言:javascript
复制
string(61) "<a href="/Link/foo/the_link.htm"> 
A <strong>Link</strong></a>"
string(31) "Its not a <strong>Link</strong>"

PS:上面的正则表达式还负责多行替换,更重要的是,它忽略了匹配,不仅忽略了HTML,还忽略了包含在<>中的任何其他实体。

编辑:如果你只想排除hrefs而不是所有的html实体,那么在我的回答中使用这个模式而不是上面的模式:

代码语言:javascript
复制
$p = '/((<)(?(2).*?href=[^>]*>)(?:.*?))*?(' . $query . ')/smi';
票数 1
EN

Stack Overflow用户

发布于 2011-04-24 07:30:31

我不是你最终想要的100%,但从我所能得到的,它是一种“搜索短语”突出显示工具,可以说它突出显示关键字。如果是这样的话,我建议看看CodeIgniter中的Text Helper。它提供了一个很好的叫做highlight_phrase的小函数,这可以做你正在寻找的事情。

函数如下所示。

代码语言:javascript
复制
function highlight_phrase($str, $phrase, $tag_open = '<strong>', $tag_close = '</strong>')
{
    if ($str == '')
    {
        return '';
    }

    if ($phrase != '')
    {
        return preg_replace('/('.preg_quote($phrase, '/').')/i', $tag_open."\\1".$tag_close, $str);
    }

    return $str;
}
票数 0
EN

Stack Overflow用户

发布于 2011-04-24 07:54:06

您可以使用条件子模式,请参阅此处的解释:http://cz.php.net/manual/en/regexp.reference.conditional.php

代码语言:javascript
复制
preg_replace("/(?(?<=href=\")([^\"]*\")|($query))/i","\\1<strong>\\2</strong>",$x);

在您的例子中,如果您有整个HTML,而不仅仅是href="",那么使用'e‘修饰符可以更容易地解决这个问题,它允许您使用PHP代码来替换匹配

代码语言:javascript
复制
function termReplacer($found) {
  $found = stripslashes($found);
  if(substr($found,0,5)=="href=") return $found;
  return "<strong>$found</strong>";
}
echo preg_replace("/(?:href=)?\S*$query/e","termReplacer('\\0')",$x);

参见示例#4 http://cz.php.net/manual/en/function.preg-replace.php如果你的表达式更复杂,你甚至可以在termReplacer()中使用regExp。

在PHP中有一个小错误:termReplacer()中的$found参数需要去掉!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5767477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档