如何使用preg_replace修剪特定值周围的所有内容

时间:2012-02-16 11:21:30

标签: php regex preg-replace

我正在尝试找到一个与模式匹配的值X:

<span class="line-item-quantity-raw">X</span>

一旦我获得了价值,我想修剪它周围的一切。虽然我知道我可以使用preg_match来获取值并设置变量,但我很好奇为什么我无法使用preg_match来实现原始方法。

$footer = '<div class="line-item-summary">
  <div class="line-item-quantity">
    <span class="line-item-quantity-raw">1</span>
    <span class="line-item-quantity-label">item</span>
  </div>
  <div class="line-item-total">
    <span class="line-item-total-label">Total:</span>
    <span class="line-item-total-raw">$1,500.00</span>
  </div>
</div>';

$pattern = '/.*<span class="line-item-quantity-raw">(\d+)<\/span>.*/';
$replace = '($1) -';
$footer = preg_replace($pattern, $replace, $footer);

不幸的是,这似乎只是删除了$pattern中指定的span标记,但$pattern边缘的额外标记仍在保留。{/ {}} p>

http://www.solmetra.com/scripts/regex/index.php之类的测试页面中烦人地运行我的代码似乎工作正常,而不是上面我在php中的代码。

2 个答案:

答案 0 :(得分:4)

这是因为默认换行符.不匹配。要使.跨越多行,您需要添加修饰符s

$pattern = '/.*<span class="line-item-quantity-raw">(\d+)<\/span>.*/s';
  

s (PCRE_DOTALL)

     

如果设置了此修饰符,则模式中的点元字符将匹配所有字符,包括换行符。没有它,排除了换行符。此修饰符等效于Perl的/ s修饰符。诸如[^ a]之类的否定类始终匹配换行符,与此修饰符的设置无关。

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

答案 1 :(得分:2)

默认情况下,点与换行符不匹配。

如果您使用/s修饰符,那么它将匹配它们(以及字符串的其余部分,可能是您想要的也可能不是。)

$pattern = '/.*<span class="line-item-quantity-raw">(\d+)<\/span>.*/s';