【问题标题】:Non greedy match does not work非贪婪匹配不起作用
【发布时间】:2017-05-07 02:57:23
【问题描述】:

我想使用.*? 模式实现非贪婪匹配。但是,我遇到了一个示例字符串,它显示非贪婪匹配不起作用。这是代码和示例字符串:

preg_match_all('/\<w:t.*?\>\<w:p\>/', '<w:t xml:space="preserve"></w:t></w:r><w:r><w:rPr><w:b/></w:rPr><w:t xml:space="preserve">Text 1 </w:t></w:r><w:r><w:rPr><w:b/><w:u w:val="single"/><w:color w:val="ff0000"/></w:rPr><w:t xml:space="preserve"></w:t></w:r><w:r><w:rPr><w:b/><w:u w:val="single"/><w:color w:val="ff0000"/><w:i/></w:rPr><w:t xml:space="preserve">Text 2</w:t></w:r><w:r><w:t xml:space="preserve"></w:t></w:r><w:r><w:t xml:space="preserve"></w:t></w:r><w:r><w:t xml:space="preserve"></w:t></w:r></w:p></w:t></w:r></w:p><w:p w:rsidRDefault="004D3323" w:rsidP="003F03B1"><w:r><w:t><w:p>', $match);

但是如果我 print_r $match 变量,我看到这个模式匹配整个字符串。但是,我想要的是只匹配这样的字符串:

"<w:t><w:p>" and "<w:t any text may go here><w:p>"

那么,我做错了什么,我该如何解决?谢谢!

【问题讨论】:

  • 我无法忍受那些喜欢保持秘密和冷静的投票者
  • 您的字符串中只有一个&lt;w:p&gt;&lt;&gt; 也不是特殊字符,因此不需要转义。
  • 整个字符串匹配它的原因是因为正则表达式是以这种方式构建的。如果您查看以&lt;w:t 开头并以&gt;&lt;w:p&gt; 结尾的整个字符串,则正则表达式匹配正确,并且将大部分字符串标识为标记的一部分。
  • @Mari M. 感谢分享想法!但是我应该如何编写我的正则表达式,这样它就不会匹配这个字符串并且只会匹配一对&lt;w:t ...&gt;&lt;w:p&gt;
  • 你应该使用解析器。使用正则表达式匹配嵌套元素将是一件痛苦/不可靠的事情。

标签: php regex


【解决方案1】:

改用这个正则表达式:

<w:t[^>]*><w:p>

[^&gt;]* 允许除&gt; 之外的所有字符

https://regex101.com/r/nuMzTk/1

【讨论】:

  • 我相信\&lt;w:p\&gt; 不需要反斜杠。可以是&lt;w:p&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2017-10-16
  • 2015-02-11
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
相关资源
最近更新 更多