【问题标题】:separate string with reg ex用正则表达式分隔字符串
【发布时间】:2014-08-17 08:36:18
【问题描述】:

当我尝试分离这个字符串时:

<b>Pristatymo laikas: </b>08-17h (visoje Lietuvoje)<br /><b>Dovanų kuponai:</b> <br />Panaudotas 200.00 Lt. dovanų kuponas, kurio kodas: xxxxx<br /><b>Mokėtina suma:</b> 12.00 Lt. <br />

带有正则表达式:

<b>(.*)</b>

我得到了这个匹配:

<b>Pristatymo laikas: </b>08-17h (visoje Lietuvoje)<br /><b>Dovanų kuponai:</b> <br />Panaudotas 200.00 Lt. dovanų kuponas, kurio kodas: xxxxx<br /><b>Mokėtina suma:</b>

但是我把&lt;b&gt;标签中的所有单词都分开了:

<b>Pristatymo laikas: </b>
<b>Dovanų kuponai:</b>
<b>Mokėtina suma:</b>

如何写出正确的模式?

【问题讨论】:

  • 您的方法的问题是* 默认情况下是贪婪的。它会吃掉&lt;/b&gt; 以及只要还有另一个&lt;/b&gt; 来匹配。

标签: php regex preg-match-all


【解决方案1】:

改用.*?

<b>(.*?)</b>

? 量词(非贪婪)尽可能少地匹配,因此在第一次遇到 &lt;/b&gt; 时停止

DEMO

【讨论】:

  • @DonatasVeikutis,没问题。很高兴我能帮上忙
【解决方案2】:

您需要关注.*? 以进行non-greedy 匹配。

<b>(.*?)</b>

虽然您可以使用简单的正则表达式来完成此操作,但最好使用解析器。

$html = '<b>Pristatymo laikas: </b>08-17h (visoje Lietuvoje)<br />
<b>Dovanų kuponai:</b> <br />Panaudotas 200.00 Lt. dovanų kuponas, kurio kodas:
xxxxx<br /><b>Mokėtina suma:</b> 12.00 Lt. <br />';

$doc = new DOMDocument();
$doc->loadHTML($html); 

$xpath = new DOMXPath($doc);

foreach ($xpath->query('//b') as $tag) {
   echo $tag->ownerDocument->saveHTML($tag) . "\n";
}

输出

<b>Pristatymo laikas: </b>
<b>Dovanų kuponai:</b>
<b>MokÄtina suma:</b>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多