我正在尝试找到一个与模式匹配的值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中的代码。
答案 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';