这是代码:
<?php
$pattern =' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$text = "kdaiuyq7e611422^^$^vbnvcn^vznbsjhf";
$text_split = str_split($text,1);
$data = '';
foreach($text_split as $value){
if (preg_match("/".$value."/", $pattern )){
$data = $data.$value;
}
if (!preg_match('/'.$value.'/', $pattern )){
break;
}
}
echo $data;
?>
当前输出:
kdaiuyq7e611422^^$^vbnvcn^vznbsjhf
预期产出:
kdaiuyq7e611422
请帮我编辑代码错误。在模式中没有^或$。但preg_match显示匹配,这是值得怀疑的。
答案 0 :(得分:1)
您的字符串$text
的{{1}}与^
字符串的开头匹配。
因此$pattern
将返回true,然后preg_match('/^/', $pattern)
将附加到^
。
你应该在$data
的帮助下将^
转义为原始字符,而不是preg_match('/\^/', $pattern)
的特殊字符,它将转义特殊字符。
答案 1 :(得分:1)
没有必要像这样分割你的字符串,正则表达式的整个点是你可以指定表达式中的所有条件。您可以将整个代码浓缩为:
$pattern = '/^[[:word:] ]+/';
$text = 'kdaiuyq7e611422^^$^vbnvcn^vznbsjhf';
preg_match($pattern, $text, $matches);
echo $matches[0];
答案 2 :(得分:1)
Kris已经准确地隔离了你的方法逃脱的是猴子扳手。这可以通过preg_quote()
或\Q
... \E
中的包裹模式字符来解决(强制字符可以按字面解释)。
在您的方法上拍打乐队(正如您在回答自己的问题时所做的那样)并不能帮助您了解应该做什么。
我建议您取消使用字符掩码,str_split()
和preg_match()
的循环调用。通过一次preg_match()
调用,您可以更加简单/高效/直接地完成任务。这是完全服从你的角色面具的干净方式:
代码:(Demo)
$text = "kdaiuyq7e611422^^$^vbnvcn^vznbsjhf";
echo preg_match('/^[a-z\d ]+/i',$text,$out)?$out[0]:'No Match';
输出:
kdaiuyq7e611422
miknik的方法接近于此,但鉴于您的问题要求,它没有保持100%的准确性。我将解释:
[:word:]
是POSIX Character Class(功能类似\w
),代表字母(大写和小写),数字和下划线。不幸的是,对于miknik来说,下划线不在你想要的字符列表中,所以这使得模式稍微不准确,对你的项目来说可能是不值得信任的。
答案 3 :(得分:-1)
<?php
$pattern = ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$text = "kdaiuyq7e611422^^$^vbnvcn^vznbsjhf";
$text_split = str_split($text,1);
$data = '';
foreach($text_split as $value){
if (preg_match("/".preg_quote($value)."/", $pattern )){
$data = $data.$value;
}
if (!preg_match('/'.preg_quote($value).'/', $pattern )){
break;
echo "not matched";
}
}
echo $data;
?>