2015-08-31 3 views
0

У меня есть функция, которая использует preg_match для проверки наличия подстроки в другой строке. Сегодня я понимаю, что если подстрока имеет специальные символы, такие как специальные символы регулярного выражения (. \ + *? [^] $() {} =! <> |: -) или @, мой preg_match не может найти подстроку четную хотя он есть.preg_match: не удается найти подстроку, которая имеет завершающие специальные символы

Это работает, возвращается «Матч был найден».

$find = "website scripting"; 
$string = "PHP is the website scripting language of choice."; 

if (preg_match("/\b" . $find . "\b/i", $string)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 

Но это не означает, что «матч не найден».

$find = "website scripting @"; 
$string = "PHP is the website scripting @ language of choice."; 

if (preg_match("/\b" . $find . "\b/i", $string)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 

Я пробовал preg_quote, но это не поможет.

Благодарим за любые предложения!

Редактировать: граница Word обязательна, поэтому я использую \ b. Я не хочу найти «телефон» в «смартфоне».

+0

'preg_quote' должен работать, вы можете повторить из' preg_quote ($) найти '' – MarshallOfSound

+1

preg_quote' не будет работать, так как у вас есть '\ b' в конце. Удалите его, если вам не нужно проверять конечную границу слова. –

+0

Не совсем понятно, какое поведение вы хотите использовать в строке поиска, например ') @ # * $ ek2' или' abc% 'или' abcdef' (обратите внимание на пробел в конце). – nhahtdh

ответ

3

Вы можете просто проверить, если символы вокруг искомого слова не являются символы слов с просмотровых обходные:

$find = "website scripting @"; 
$string = "PHP is the website scripting @ language of choice."; 

if (preg_match("/(?<!\\w)" . preg_quote($find, '/') . "(?!\\w)/i", $string)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 

См IDEONE demo

Результат: A match was found.

Примечание двойной слэш используется с \w в (?<!\\w) и (?!\\w), так как вам нужно избегать специальных символов регулярных выражений в интерполированных строках.

Функция preg_quote необходима, так как поисковое слово - из того, что я вижу - может иметь специальные символы, а некоторые из них должны быть экранированы, если они предназначены для соответствия буквенным символам.

UPDATE

Существует способ построить регулярное выражение с лихом размещенных словоразделами вокруг ключевого слова, но производительность будет хуже по сравнению с вышеописанным подходом. Вот пример кода:

$string = "PHP is the website scripting @ language of choice."; 

$find = "website scripting @"; 
$find = preg_quote($find); 
if (preg_match('/\w$/u', $find)) { // Setting trailing word boundary 
    $find .= '\\b'; 
} 
if (preg_match('/^\w/u', $find)) { // Setting leading word boundary 
    $find = '\\b' . $find; 
} 

if (preg_match("/" . $find . "/ui", $string)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 

См another IDEONE demo

+2

Проблема остается такой же, если цель состоит в том, чтобы сопоставить «scripting @» в этих случаях «scripting @» или «» scripting @, »и не в этих случаях скрипты '' scripting @@ "или' "@a" '. –

+0

@CasimiretHippolyte: Просто закройте вопрос как неясный. С одним примером. ОП просит нас угадать эти случаи. – nhahtdh

+0

@ Jonny5: Спасибо, я пропустил эту часть, теперь обновлен. Казимир, что касается того, полностью ли это решает проблему или нет, в большинстве случаев достаточно просто проверить символы слова до и после ключевого слова. –

0

Если вы пытаетесь найти строку из другой строки, вы можете strpos().

Ex.

<?php 

$find = "website scripting"; 
$string = "PHP is the website scripting language of choice."; 

if (strpos($string,$find) !== false) { 
    echo 'true'; 
} else { 
    echo 'false'; 
} 
+1

Строго говоря, 'stripos' может быть полезен, поскольку поиск не чувствителен к регистру, но как насчет требования всего слова (т. Е. Больше букв или цифр или подчеркивания вокруг ключевого слова)? –

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