Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.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代码中未显示预期的输出_Php_Regex_String - Fatal编程技术网

php代码中未显示预期的输出

php代码中未显示预期的输出,php,regex,string,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."/",

代码如下:

<?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
请帮助我编辑我的代码错误。在模式中没有^或$。但preg_match正在显示匹配,这是值得怀疑的


<?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;




?>

您的字符串
$text
具有与字符串
$pattern
开头匹配的
^

因此,
preg_match('/^/',$pattern)
将返回true,然后
^
将附加到
$data


您应该将
^
作为原始字符转义,而不是使用
preg\u match(“/\^/”,$pattern)
的特殊字符,方法是使用
preg\u quote()
,它将转义特殊字符。

没有必要像这样拆分字符串,正则表达式的要点是,您可以指定表达式中的所有条件。您可以将整个代码压缩为:

$pattern = '/^[[:word:] ]+/';
$text = 'kdaiuyq7e611422^^$^vbnvcn^vznbsjhf';
preg_match($pattern, $text, $matches);
echo $matches[0];

Kris已经准确地分离出你的方法中的逃逸是活动扳手。这可以通过
preg_quote()
\Q
中的包装模式字符来解决<代码>\E(强制按字面解释字符)

在你的方法上贴上绷带(就像你在回答自己的问题时所做的那样)无助于你看到你应该做什么

我建议您取消字符掩码、
str_split()
preg_match()的循环调用。只需一个
preg\u match()
调用,您的任务就可以更简单/高效/直接地完成。以下是完全遵守角色掩码的干净方法:

代码:()

输出:

kdaiuyq7e611422
miknik的方法接近于此,但鉴于您的问题要求,它并没有保持100%的准确性。我会解释:


[:word::
是一个(功能类似于
\w
),表示字母(大写和小写)、数字和下划线。不幸的是,对于miknik来说,下划线不在您的通缉字符列表中,因此这会使模式稍微不准确,并且可能对您的项目不可靠。

可能使用
preg_quote($value)
?您做了什么?只有代码的答案很少有帮助。请编辑并更新您的答案。我的代码提供了所需的输出。当前输出:kdaiuyq7e611422^^$^vbnvcn^vznbsjhf预期输出:kdaiuyq7e611422@AsifIqbal这不是你应该执行任务的方式,请阅读我的答案。我希望你能在你的项目中使用我的方法。
$text = "kdaiuyq7e611422^^$^vbnvcn^vznbsjhf";
echo preg_match('/^[a-z\d ]+/i',$text,$out)?$out[0]:'No Match';
kdaiuyq7e611422