flo*_*eft 6 php regex preg-replace
我正在创建一个简单的搜索我的应用程序.
我正在使用PHP正则表达式替换(preg_replace)来查找搜索词(不区分大小写)并<strong>在搜索词周围添加标签.
preg_replace('/'.$query.'/i', '<strong>$0</strong>', $content);
现在我对正则表达式不是最好的.那么我将添加到正则表达式中以不替换href锚标记中的搜索项?
如果有人搜索"信息",它不会改变到"http://something.com/this_这样<strong>的信息</strong>/index.htm"明明
我相信您将需要条件子模式]为此目的:
$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 );
Run Code Online (Sandbox Code Playgroud)
string(61) "<a href="/Link/foo/the_link.htm">
A <strong>Link</strong></a>"
string(31) "Its not a <strong>Link</strong>"
Run Code Online (Sandbox Code Playgroud)
PS:上面的正则表达式还负责多行替换,更重要的是,它不仅忽略匹配<href,还忽略匹配和中包含的任何其他 HTML 实体>。
编辑:如果您只想排除hrefs而不是所有 html 实体,则在我的答案中使用此模式而不是上面的模式:
$p = '/((<)(?(2).*?href=[^>]*>)(?:.*?))*?(' . $query . ')/smi';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |