我假设您应该基于DOMDocument和DOMXPath而不是使用正则表达式来创建函数.即使那些功能非常强大,您也遇到了一些问题,例如您所描述的问题,这些问题并非(总是)通过正则表达式来解决.

一般说法是:不要用正则表达式解析HTML.

记住这一点是一个很好的规则,虽然它与任何规则一样,并不总是适用,但值得一提的是.

XPath允许您查找仅包含文本中所有搜索项的所有文本,忽略所有XML元素.

然后你只需要将这些文本包装到< span>你完成了

编辑:最后一些代码;)

首先,它使用xpath来定位包含搜索文本的元素.我的查询看起来像这样,这可能写得更好,我不是超级xpath pro:

'//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..'

$search包含要搜索的文本,不包含任何“(引用)字符(这会破坏它,如果需要引号,请参阅Cleaning/sanitizing xpath attributes以获得解决方法).

此查询将返回包含文本节点的所有父节点,这些节点组合在一起将是包含搜索词的字符串.

因为这样的列表不容易进一步处理,我创建了一个表示DOMText节点列表的TextRange类.在文本节点列表上执行字符串操作非常有用,就好像它们是一个字符串一样.

这是例程的基本框架:

$str = '...'; # some XML

$search = 'text that span';

printf("Searching for: (%d) '%s'\n", strlen($search), $search);

$doc = new DOMDocument;

$doc->loadXML($str);

$xp = new DOMXPath($doc);

$anchor = $doc->getElementsByTagName('body')->item(0);

if (!$anchor)

{

throw new Exception('Anchor element not found.');

}

// search elements that contain the search-text

$r = $xp->query('//*[contains(., "'.$search.'")]/*[FALSE = contains(., "'.$search.'")]/..', $anchor);

if (!$r)

{

throw new Exception('XPath failed.');

}

// process search results

foreach($r as $i => $node)

{

$textNodes = $xp->query('.//child::text()', $node);

// extract $search textnode ranges, create fitting nodes if necessary

$range = new TextRange($textNodes);

$ranges = array();

while(FALSE !== $start = strpos($range, $search))

{

$base = $range->split($start);

$range = $base->split(strlen($search));

$ranges[] = $base;

};

// wrap every each matching textnode

foreach($ranges as $range)

{

foreach($range->getNodes() as $node)

{

$span = $doc->createElement('span');

$span->setAttribute('class', 'search_hightlight');

$node = $node->parentNode->replaceChild($span, $node);

$span->appendChild($node);

}

}

}

对于我的示例XML:

This is some text that span across a page to search in.

and more text that span

它产生以下结果:

This is some text that span across a page to search in.

and more text that span

这表明这甚至允许查找分布在多个标签上的文本.对于正则表达式来说,这并不容易.

你可以在这里找到完整的代码:http://codepad.viper-7.com/U4bxbe(包括我从答案示例中取出的TextRange类).

由于该网站使用的旧版LIBXML版本,它在viper键盘上无法正常工作.它适用于我的LIBXML版本20707.我创建了一个关于此问题的相关问题:XPath query result order.

警告提示:此示例使用二进制字符串搜索(strpos)和用于使用DOMText::splitText函数拆分文本节点的相关偏移量.这可能导致错误的偏移,因为函数需要UTF-8字符偏移.正确的方法是使用mb_strpos获取基于UTF-8的值.

该示例仍然可行,因为它仅使用US-ASCII,其具有与示例数据相同的UTF-8偏移量.

对于现实生活情况,$search字符串应该是UTF-8编码的,应该使用mb_strpos而不是strpos:

while(FALSE !== $start = mb_strpos($range, $search, 0, 'UTF-8'))

php preg_replace html,php – 忽略preg_replace中的html标签相关推荐

  1. 如何忽略Git中目录中的文件?

    本文翻译自:How do I ignore files in a directory in Git? What is the proper syntax for the .gitignore file ...

  2. @JsonIgnoreProperties转换实体时忽略json中不存在的字段

    开发时遇见这么一个情况,对接放发出的json格式不确定,这里的不确定是json中的字段不确定,以往都是采用gson进行实体和json的转换,但是找了挺长时间,还是没找到gson中可以解决这个情况的办法 ...

  3. java date不要秒_java – 比较日期忽略Joda中DateTime的秒和毫秒时刻

    我们假设我有两个日期,如下所示. DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm:ss& ...

  4. python字符串转义序列_Python | 忽略字符串中的转义序列

    python字符串转义序列 First see, how escape sequence works? 首先看,转义序列如何工作? In the below example, we are using ...

  5. Git忽略项目中的指定的文件

    使用IDE开发具体的java总会随着编译产生一些临时文件,比如:*.class.iml(使用idea产生的配置文件)..DS_Store(mac系统的).target文件夹,使用git status命 ...

  6. php 替换指定标签中的内容,php如何根据不同的条件替换html代码中的img标签

    这篇文章给大家介绍的内容是关于php根据不同的条件替换一段html代码中的不同的img标签,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.需求 这次的需求是获取到一段html代码 ...

  7. java中写html标签,java写html剔出标签

    java写html剔出标签 [2021-02-04 19:54:11]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...

  8. java输出中写html标签,java 输出html标签

    java 输出html标签 [2021-02-01 07:37:44]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...

  9. php去除字符串样式,php去除字符串中的HTML标签方法总结

    php去除字符串中的HTML标签方法有很多的今天在做一个采集小功能时发现了有N种方法,下面我为各位整理一下有原创的也有整理的,希望对大家有帮助. 先来看自己的写法  代码如下 复制代码 str_rep ...

最新文章

  1. 函数动态传参详细,作用域和名称空间,global和nonlocal
  2. 如何做好内容策划并完成一篇合格的深度文?
  3. C语言控制台应用程序绘制曲线,C语言控制台绘制曲线的实现代码
  4. Windows修改键盘映射
  5. 为什么员工 996 多猝死,而企业家 996 甚至 9127 却很少听到有猝死的?答案原来是.....
  6. masonry布局出现 'couldn't find a common superview for...报错解决办法
  7. 用Dockerfile构建MySQL镜像并实现容器启动过程中MySQL数据库系统的初始化
  8. 采访:应用软件定制化有什么优点?
  9. 重庆大学计算机类专业分数线,重庆大学录取分数线 2019年重庆大学各专业录取分数线...
  10. pygame小游戏——中国地图拼图小游戏
  11. ★ 我的世界各类奇葩武器实现!(命令方块1.13+)
  12. 一份比较实用的Ubuntu下替代WIN软件列表
  13. 在Multisim导入TI提供的SPICE模型
  14. 手机连接电脑linux系统怎么样的,手机真能取代电脑吗?谈手机/PC系统的大一统...
  15. portal无线认证服务器,无线AC配置portal认证功能portal 认证服务器问题
  16. 数据分析思维九段路线图
  17. 小梅哥FPGA视频教程学习总结(持续学习中……)
  18. 启动和关闭MySQL服务
  19. 图像处理之LUT表的使用
  20. Python基础第一课

热门文章

  1. [SCSS] Pure CSS for multiline truncation with ellipsis
  2. document.body 与 document.documentElement区别介绍
  3. 基于OneAPM的Web系统性能监测
  4. JavaScriptCore框架在iOS7中的对象交互和管理
  5. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
  6. TestNg的IReporter接口的使用
  7. JVM的内存区域划分
  8. 1)Java JDK和JRE
  9. EDC(Enterprise Data Center 企业数据中心)
  10. 操作系统知识点大总结【管程与死锁】