在正则表达式中回显不匹配的字符

时间:2014-02-09 15:59:32

标签: php regex

我想回应正则表达式中无法匹配的字符

$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 = '@#-.';

3 个答案:

答案 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,因此成本更低。
谓词是:

  • 找到一个匹配;
  • 如果该匹配的长度与值相同,则为完全匹配(语法正常);
  • 其他是KO。

由于在开始和结束时都可能发生不匹配,因此我在替换期间将占位符()分隔为错误的部分。

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