2017-01-23 9 views
-4

Я хочу написать регулярное выражение, чтобы найти символ «&», который появляется в строке более одного раза. Необходимо использовать только функцию preg_match. Так, например,Регулярное выражение для функции preg_match в PHP для символов, встречающихся более одного раза

$string ="& Test character &"; // should return true 

$string =" Test character &&"; // should return true 

$string - " Test character &"; // should return false 

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

+2

aaaand какие были те выражения, которые вы пытались, и как они не работали? и почему [substr_count] (https://secure.php.net/manual/en/function.substr-count.php) не вариант? –

+1

Используйте 'substr_count ($ string, '&')' и получите обзор здесь http://php.net/manual/en/extensions.membership.php подробнее http://php.net/manual/en/book .strings.php. – JustOnUnderMillions

+0

Я знаю, что есть несколько функций, которые могут работать ...но, как я уже говорил, я хочу использовать только функцию preg_match. – Abhijit

ответ

0

Это звучит почти как домашнее задание вопрос, так что здесь несколько идей, не полностью отдать его:

  1. Предполагая, что вы просто должны знать, если есть несколько вхождений, вы можете предоставить выражение который соответствует двум символам «&» с чем-либо до, между ними или после них. Если выражение совпадает, то вы знаете, что у вас есть как минимум два.
  2. Если вам действительно нужно знать, сколько есть, укажите выражение, которое ищет один «&» и захватывает его, а затем проверит массив совпадений, возвращаемых функцией preg_match_all().

Update: Добавить детали за комментарий от плаката

Вот код:

<?php 

$hay = 'abc&def&ghi'; 

//approach 1 
if (preg_match('/&.*&/', $hay)) { 
    echo "There is more than one ampersand\n"; 
} else { 
    echo "There are no ampersands\n"; 
}; 

//approach 2 
if (preg_match_all('/&/', $hay, $matches)) { 
    echo 'Ampersand count: ' . count($matches[0]) . "\n"; 
} else { 
    echo "There are no ampersands\n"; 
}; 

//approach 3 
if ($count = preg_match_all('/&/', $hay)) { 
    echo "Ampersand count: $count\n"; 
} else { 
    echo "There are no ampersands\n"; 
}; 

Не стесняйтесь экспериментировать щипая значение $ сена.

Для первого подхода подвыражение «. *» Ищет нуль или более любого символа, поэтому все выражение ищет два символа амперсанда с нулевым или большим количеством символов - ничего (или ничего) - между ними , (Вы можете включить субэкпозицию «. *» В начале и конце выражения, но это не обязательно, потому что preg_match() будет соответствовать выражению в любом месте строки. Другими словами, ведущая и конечная фраза «. *» -выражения неявные.)

Для второго подхода выражение просто амперсанд само по себе. Мы позволяем preg_match_all() находить их, тогда мы видим, сколько их найдено. Поскольку выражение в данном случае это не более чем простая константа, по сравнению с динамическим выражением, он хорошо показывает, почему вы можете отойти от PREG _ *() и просто использовать substr_count(), например так:

$count = substr_count($hay, '&'); 

или если вы не заботитесь о подсчете:

$hasAmps = strpos($hay, '&') !== false; 

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

+0

@ Mr.w .... не могли бы вы предоставить мне точное выражение ... я логически не понимаю, как я могу это достичь ... но я немного слаб с регулярными выражениями ... так что, пожалуйста, помогите мне вне... ?? – Abhijit

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

  • Нет связанных вопросов^_^