[英]Php regex in variable
正则表达式: /priceSheet\\[1\\]\\[1\\]\\s=\\s\\"\\d{1,3}\\";/
匹配 priceSheet[1][1] = "30"; priceSheet[1][2] = "31";
字符串 priceSheet[1][1] = "30"; priceSheet[1][2] = "31";
priceSheet[1][1] = "30"; priceSheet[1][2] = "31";
当我使用
preg_match("/priceSheet\[1\]\[1\]\s=\s\"\d{1,3}\";/", $priceSheet, $matches);
它有效,但是
$min = `/priceSheet\[1\]\[1\]\s=\s\"\d{1,3}\";/`
preg_match($min, $priceSheet, $matches);
没有结果。 为什么是这样? 我正在使用php 7.0。
编辑:所以问题是:当我将正则表达式放在变量中时,为什么它不起作用? 当我按原样使用正则表达式时,它可以工作。
使用preg_match_all
而不是preg_match
来匹配所有输入。
<?php
$min = "/priceSheet\[1\]\[1\]\s=\s\"\d{1,3}\";/";
$priceSheet = 'priceSheet[1][1] = "30"; priceSheet[1][2] = "31";';
preg_match_all("/priceSheet\[\d\]\[\d\]\s*=\s*\"\d{1,3}\";/", $priceSheet, $matches);
print_r($matches);
输出:
Array
(
[0] => Array
(
[0] => priceSheet[1][1] = "30";
[1] => priceSheet[1][2] = "31";
)
)
使用您的模式仅获取priceSheet[1][1]
,将其调整为使用()
捕获所需的数字:
$min = "/priceSheet\[1\]\[1\]\s=\s\"(\d{1,3})\";/";
$priceSheet = 'priceSheet[1][1] = "30"; priceSheet[1][2] = "31";';
preg_match($min, $priceSheet, $matches);
print_r($matches);
然后,您需要$matches[1]
:
Array
(
[0] => priceSheet[1][1] = "30";
[1] => 30
)
似乎其他张贴者没有费心去解释您为什么会遇到这种麻烦-这是实际的问题。
您正在使用:
||-------||----- escaped double quotes
$min = `/priceSheet\[1\]\[1\]\s=\s\"\d{1,3}\";/`
^---- back-ticks ------------------------^^---no semicolon
您应该仅在php中的字符串上使用单引号或双引号,而不应使用反引号。 反引号是(我的头顶)mysql列名称和shell命令。 当我尝试在http://sandbox.onlinephpfunctions.com/上运行您的反引号行时,它说:
“ 警告 :出于安全原因,shell_exec()已被禁用...”
如果用双引号重新包装正则表达式模式,那么一切都会变得很美好,因为该模式中的双引号已被转义。
新代码:
"$min = "/priceSheet\[1\]\[1\]\s=\s\"\d{1,3}\";/";
接下来,我想知道您在AbraCadaver的回答下发表的评论。
谢谢,但是我真的只需要匹配priceSheet [1] [1]
这是否意味着您仅在检查输入字符串中是否存在该子字符串? 如果这是真的,那么正则表达式解决方案就显得过头了,只需使用strpos()
这样:
$priceSheet='priceSheet[1][1] = "30"; priceSheet[1][2] = "31";';
if(strpos($priceSheet,'priceSheet[1][1]')!==false){
echo "found";
}else{
echo "not found";
}
// output: found
作为最佳实践,当非正则表达式字符串函数可以合理地完成工作时,请始终避免使用正则表达式解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.