我想回应正则表达式中无法匹配的字符
$value = 'thisisthis123';
if ( preg_match('/^[a-zA-Z0-9 ]+$/', $value) )
{
echo "CORRECT SYNTAX";
}
else
{
echo "WRONG SYNTAX";
}
以上代码完美无缺。但是,如果语法错误,会发生什么变化呢?我怎么能回应错误的字符
e.g。
$value = 'unwan@#-.';
if ( preg_match('/^[a-zA-Z0-9 ]+$/', $value) )
{
echo "CORRECT SYNTAX";
}
else
{
echo "WRONG SYNTAX";
}
现在我希望回声像“错误的语法”(@# - 。)
知道怎么做到这一点?有preg或其他功能吗?
编辑:
我想要匹配的字符和不匹配的字符 例如
$matched = 'unwan';
$unmatched = '@#-.';
答案 0 :(得分:2)
您可以删除所有匹配的字符,因此只剩下不匹配的字符:
<?php
$value = 'unwan@#-.';
echo preg_replace('/[a-zA-Z0-9 ]/', '', $value) ;
?>
输出为@#-.
如果将正则表达式模式保存在变量中,则不必键入两次(如果更改,则更新两次)。我还添加了您的编辑,您可以使用否定模式(模式前面的^
)实现此目的。
<?php
$value = 'unwan@#-.';
$pattern = 'a-zA-Z0-9 ';
if ( preg_match('/^['.$pattern.']+$/', $value) )
{
echo "CORRECT SYNTAX";
}
else
{
echo "WRONG SYNTAX".PHP_EOL;
echo "matched: ".preg_replace('/[^'.$pattern.']/','',$value).PHP_EOL;
echo "unmatched: ".preg_replace('/['.$pattern.']/','',$value).PHP_EOL;
}
?>
答案 1 :(得分:0)
不要寻找那些代表“正确语法”的模式,而是寻找那些代表“错误语法”的模式。然后,捕获这些匹配并打印出来。
<?php
$value = 'unwan@#-.';
if ( preg_match_all('/[^a-zA-Z0-9 ]+/', $value, $matches) )
{
echo "WRONG SYNTAX";
foreach($matches[0] as $match) {
echo " ($match)";
}
}
else
{
echo "CORRECT SYNTAX";
}
答案 2 :(得分:0)
我看到答案已经被接受,但是我提供了这个答案,它只进行一次regexp,因此成本更低。
谓词是:
由于在开始和结束时都可能发生不匹配,因此我在替换期间将占位符()
分隔为错误的部分。
<?php
$value = 'unwan@#-';
$pattern = 'a-zA-Z0-9 ';
preg_match('/['.$pattern.']+/', $value, $matches) ;
if ( strlen($value) == strlen($matches[0]) )
{
echo "CORRECT SYNTAX".PHP_EOL;
}
else
{
echo "WRONG SYNTAX".PHP_EOL;
echo "matched: ".$matches[0].PHP_EOL;
echo "unmatched: ".str_replace($matches[0],'()',$value).PHP_EOL;
}
?>