regex - 如何结合这两种正则表达式模式?

标签 regex

不得不问这个问题我感觉很傻,但我无法让它发挥作用来挽救我的生命......

什么有效

preg_replace( '/(<[^>]+) onmouseout=".*?"/i', '$1', preg_replace( '/(<[^>]+) onmouseover=".*?"/i', '$1', $strHtml ) )

如何将这两个 preg_replace 函数合并为一个(通过组合两个正则表达式模式?

我的清理尝试(不起作用)
preg_replace( '/(<[^>]+) (onmouseover|onmouseout)=".*?"/i', '$1', $strHtml )

我想要这个preg_replace()删除所有 onmouseover 的功能和 onmouseout我的 HTML 字符串中的属性。它似乎只删除了两个属性之一......我做错了什么?

更新:示例字符串
<p><img src="http://www.bestlinknetware.com/products/204233spc.jpg" width="680" height="365"><br>   <a href="http://www.bestlinknetware.com/products/204233INST.pdf" target="_blank" onmouseover="MM_swapImage('Image2','','/Content/bimages/ins2.gif',1)" onmouseout="MM_swapImgRestore()"><img name="Image2" border="0" src="http://www.bestlinknetware.com/Content/bimages/ins1.gif"></a> </p> <p><strong>No contract / No subscription / No monthy fee<br> 1080p HDTV reception<br> 32db high gain reception<br> Rotor let you change direction of the antenna to find best reception</strong></p>  <a href=http://transition.fcc.gov/mb/engineering/dtvmaps/  target="blank"><strong>CLICK HERE</strong></a><br>to see HDTV channels available in your area.<br> <br/> ** TV signal reception is immensely affected by the conditions such as antenna height, terrain, distance from broadcasting transmission antenna and output power of transmitter. Channels you can watch may vary depending on these conditions. <br> <br/> <br/> <p>* Reception: VHF/UHF/FM<br/>   * Reception range: 120miles<br/>   * Built-in 360 degree motor rotor<br>   * Wireless remote controller for rotor (included)<br/>   * Dual TV Outputs<br>   * Easy Installation<br>   * High Sensitivity Reception<br>   * Built-in Super Low Noise Amplifier<br>   * Power : AC15V 300mA<br> <br/> Kit contents<br/> * One - HDTV Yagi antenna with built-in roter & amplifier<br/> * One - Roter control box<br/> * One - Remote for roter control box<br/> * One - 40Ft coax cable<br/> * One - 4Ft coax cable<br/> * One - power supply for roter control box</p>

更新:该线程 future View 的工具

https://regex101.com/

我永远无法弄清楚如何使用 http://regexr.com/ ,所以我尝试了这个 regex101.com 网站,从那以后我就一直喜欢它。强烈推荐给任何面临类似问题的人(就像我最初所做的那样使用剪切和粘贴正则表达式模式......)。

最佳答案

你原来的表达的问题是最初的那组抓得太多了,所以两个被替换的唯一一个是最后出现的那个。那是因为贪婪[^>]+重复占用的搜索字符串比您预期的要大,捕获从第一个所需匹配的开头到您想要摆脱的第二个属性的所有内容。
然后将模式锚定到 html 标记的起始括号也可以防止元素内出现多个匹配,即使在解决了该问题之后也是如此。

如果您想一键完成此操作,请调用 preg_replace()然后,与其尝试获取要保留的文本,不如寻找要删除的文本(通过用空字符串替换)更有意义:

preg_replace( '/(onmouseover|onmouseout)=".*?"/i', '', $strHtml )

您已经对属性值进行了非贪婪匹配(使用 .*? ),并且根据您之前的代码,它似乎已经为您运行良好。请注意,此特定表达式并未涵盖 HTML/XML 文档中所有可能的变体(例如空格和引号)。我相信您可以判断这是否足以满足您的需求。

关于regex - 如何结合这两种正则表达式模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34734160/

相关文章:

javascript - 正则表达式以特定长度分割字符串并忽略不完整的单词

正则表达式 - 匹配 URL,除了个别情况

javascript 正则表达式替换不起作用,但字符串替换有效

java - XML 到 HTML 标签的转换

java - 正则表达式: ignore what is quoted in a string

javascript - 正则表达式:查找函数第一个参数使用的属性

php - 如何让我的移动网站绕过移动重定向?

java - 快速替换 XML 节点值

regex - 使用复杂正则表达式的 Grep

java - 我可以在具有以下条件的 java 中为以下字符串获取适当的正则表达式吗