2012-05-23 4 views
1

Я написал эту функцию:Почему это регулярное выражение играет?

function contain_special($string){ 
# -- Check For Any Special Chars -- 
if(preg_match('/[^a-z0-9]/',$string)){ 
# - Special Chars Were Found - 
return true;  
}//end of special chars found 
else{ 
# - String Does Not Contain Special Chars - 
return false; 
}//end of else - does not contain special chars 
}//end of function 

Чтобы проверить, если строка содержит специальные символы.

Функция должна игнорировать буквенно-цифровые символы и искать специальные символы. Если найдено, верните true, еще, верните false.

Теперь все хорошо работает при тестировании его с большинством специальных символов:

$text="sdfs-df"; 

var_dump(contain_special($text));//returns true because "-" was found 

НО, когда у меня есть $, который не является в определенной позиции строки, функция не в состоянии поднять его:

$text="sdfsdf$";//this works 
$text="sdf$sdf";//this does not work 
$text="$sdfsdf";//this works 

Любые идеи о том, что я делаю неправильно здесь?

+3

Смешанный синтаксис комментария одной строки. Проклятие моего существования. – BoltClock

+3

Используйте одинарные кавычки, иначе использование '$' можно рассматривать как переменную. – Wiseguy

+0

@BoltClock Я так плохо комментирую? –

ответ

2

Посмотрите на echo $text. Возможно, вы не используете строку, которую вы считаете. Буквенные знаки доллара часто должны быть экранированы в строках с двойными кавычками, так что вы не используете переменную, например, $sdfsdf.

Я бы рекомендовал использовать одиночные кавычки здесь.

http://php.net/manual/en/language.types.string.php

+0

А! В этом есть смысл. Благодарю. –

0

^ для начала строки. Ok - это также отрицает интервал (но вам не нужно отрицать - просто переключите true и false)

$ предназначен для конца строки.

* означает нуль руды больше раз.

Так что я думаю, что регулярное выражение вы хотите: \^[a-z0-9]*$\

ли это работает?

+0

Это делает то же самое в обратном порядке. Регулярное выражение Аскера обнаруживает, что существует специальный символ; ваши тесты всей строки являются буквенно-цифровыми. – Wiseguy

+0

@Wiseguy: да - я вижу сейчас. Сделано редактирование. Но имеет ли это такую ​​же проблему? – hpekristiansen

+0

ОК - @georgefox уже нашел реальную проблему: o) ... замену переменных. – hpekristiansen

0

доллары в двойных кавычках начинают замену переменных, если за ними не следует символ, который действительно запускает имя переменной. Это объясняет, почему $text="sdfsdf$" работает и $text="sdf$sdf" нет. Ваш последний пример может работать, если у вас есть переменная с именем $sdfsdf.

Смежные вопросы