2014-02-09 2 views
0

Я хочу повторить несовпадающие символы в регулярных выраженияхэхо несовпадающие символы в регулярных выражениях

$value = 'thisisthis123'; 
if (preg_match('/^[a-zA-Z0-9 ]+$/', $value)) 
{ 
    echo "CORRECT SYNTAX"; 
} 
else 
{ 
    echo "WRONG SYNTAX"; 
} 

Приведенный выше код работает отлично. Но вот что происходит, если синтаксис неправильный? как я могу эхо ошибочные символы

например.

$value = '[email protected]#-.'; 
if (preg_match('/^[a-zA-Z0-9 ]+$/', $value)) 
{ 
    echo "CORRECT SYNTAX"; 
} 
else 
{ 
    echo "WRONG SYNTAX"; 
} 

Теперь я хочу, чтобы эхо быть как "неправильный синтаксис" (@ # -.)

Любая идея, как это сделать? с preg или некоторой другой функцией?

EDIT:

Я хочу совпавшие символы и несовпадающие символы например

$matched = 'unwan'; 
$unmatched = '@#-.'; 

ответ

1

Вы можете раздеться все соответствующие символы и поэтому только непревзойденная остаются:

<?php 
    $value = '[email protected]#-.'; 
    echo preg_replace('/[a-zA-Z0-9 ]/', '', $value) ; 
?> 

Выход @#-.

Если сохранить шаблон регулярного выражения в переменной, вы не должны введите его дважды (и дважды обновите его, если он изменится). Я также добавил ваше редактирование, вы достигаете этого с помощью шаблона с отрицанием (^ перед рисунком).

<?php 
$value = '[email protected]#-.'; 
$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; 
} 
?> 
0

Вместо того, чтобы искать для тех моделей, которые представляют собой «правильный синтаксис», смотрите вместо тех, которые представляют собой «неправильный синтаксис.» Затем захватите эти матчи и распечатайте их.

<?php 

$value = '[email protected]#-.'; 
if (preg_match_all('/[^a-zA-Z0-9 ]+/', $value, $matches)) 
{ 
    echo "WRONG SYNTAX"; 
    foreach($matches[0] as $match) { 
    echo " ($match)"; 
    } 
} 
else 
{ 
    echo "CORRECT SYNTAX"; 
} 
0

Я видел, что ответ был принят, но я предоставляю этот, который повторно выражает только один раз и поэтому стоит меньше.
Предикат:

  • найти матч;
  • если это совпадение имеет ту же длину, что и значение, это полное соответствие (синтаксис ОК);
  • еще это КО.

Так как непревзойденный может произойти в начале И в конце, я положил местозаполнитель () при замене на отдельные неправильные детали.

<?php 
$value = '[email protected]#-'; 
$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; 
} 
?> 
Смежные вопросы