【问题标题】:preg_match_all for two words, allowing chars in the middlepreg_match_all 两个单词,中间允许字符
【发布时间】:2015-11-02 04:56:45
【问题描述】:

我想要做的是,给定一个字符串,例如

trying to download some music, give me the details to download the music

通过 preg_match_all 获得匹配结果,这会给我类似的东西

[0][0] => download some music
[0][1] => some
[1][0] => download the music
[1][1] => the

但我无法做到这一点。我正在使用这种模式

§download(.*)music(.*)§

但问题是它只匹配第一个download(来自download some music)和最后一个music(来自download the music),而我的目标是找到所有出现并获取两个单词之间的字符(它实际上应该适用于任意数量的单词,但让我们从两个开始)。

感谢任何帮助,谢谢! :)

更新:问题解决后,我写了一篇关于如何使用这种正则表达式进行温和模式匹配的文章(或者,更确切地说,计算给定文本中的模式相关性):http://www.thecrowned.org/method-for-pattern-relevance-in-text

【问题讨论】:

  • 所以你是说正则表达式太“greedy”了?
  • download\s*\b(.*?)\b\s*music\b
  • 是的,就是这样......这个想法是它应该找到download,然后在它之后寻找music,只要它找到它,而不匹配中间。

标签: php regex pattern-matching


【解决方案1】:
\bdownload\b(.*?)\bmusic\b

              ^^

搜索non greedy。查看演示。

https://regex101.com/r/fM9lY3/29

$re = "/\\bdownload\\b(.*?)\\bmusic\\b/"; 
$str = "trying to download some music, give me the details to download the music"; 

preg_match_all($re, $str, $matches);

【讨论】:

猜你喜欢
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 2012-05-27
  • 2021-07-07
  • 2012-04-13
  • 2015-04-08
相关资源
最近更新 更多