期望输出不是从PHP代码显示

时间:2017-11-18 16:04:55

标签: php regex string

这是代码:

<?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显示匹配,这是值得怀疑的。

4 个答案:

答案 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;




?>