Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用preg_replace围绕特定值修剪所有内容_Php_Regex_Preg Replace - Fatal编程技术网

Php 如何使用preg_replace围绕特定值修剪所有内容

Php 如何使用preg_replace围绕特定值修剪所有内容,php,regex,preg-replace,Php,Regex,Preg Replace,我试图找到一个与模式匹配的值X: <span class="line-item-quantity-raw">X</span> X 一旦我得到了这个值,我想修剪它周围的所有东西。虽然我知道我可以使用preg_match来获得值并设置变量,但我很好奇为什么我不能使用preg_match来实现我的原始方法 $footer = '<div class="line-item-summary"> <div class="line-item-quantity"

我试图找到一个与模式匹配的值X:

<span class="line-item-quantity-raw">X</span>
X
一旦我得到了这个值,我想修剪它周围的所有东西。虽然我知道我可以使用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);
$footer=<
1.
项目
总数:
$1,500.00
';
$pattern='/.*(\d+).*/';
$replace='($1)-';
$footer=preg_replace($pattern,$replace,$footer);
不幸的是,这似乎只去除了
$pattern
中指定的span标记,但是
$pattern
边缘上的额外标记,如
*
仍在保留


令人烦恼的是,在测试页面中运行我的代码,就像在php中运行我上面的代码一样。默认情况下,点与换行符不匹配

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

$pattern='/.*(\d+).*/s';

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

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

$pattern='/.*(\d+).*/s';

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

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

如果设置了此修改器,则图案中的点元字符将匹配所有字符,包括换行符。没有它,新行被排除在外。此修饰符相当于Perl的/s修饰符。像[^A]这样的负数类始终与换行符匹配,与此修饰符的设置无关


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

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

如果设置了此修改器,则图案中的点元字符将匹配所有字符,包括换行符。没有它,新行被排除在外。此修饰符相当于Perl的/s修饰符。像[^A]这样的负数类始终与换行符匹配,与此修饰符的设置无关


请注意,
DOTALL
标志有点生硬。无论如何,强烈建议使用非贪婪量词
+?
*?
,以避免过度匹配过多字符串,但在使用
DOTALL
@Li aungYip时,您的观点绝对有效,但在这种特殊情况下,这是期望的行为。请注意,
DOTALL
标志有点生硬。无论如何,强烈建议使用非贪婪量词
+?
*?
,以避免过度匹配过多字符串,但在使用
DOTALL
@Li aungYip时,您的观点绝对有效,但在这种特殊情况下,这是所需的行为。感谢您的回答,你有太多的代表:)谢谢你的回答,你有太多的代表:)