2013-07-13 2 views
1

У меня есть строка, и я хочу найти количество всех звуков слова A, за которым следует любое слово, но слово B, используя preg_match или preg_match_all в PHP ,Нахождение видимости слова A, за которым следует все, кроме B, с помощью preg_match в PHP

Например, предположим, что A = 'Hello' и B = 'Bye', а наша строка - Str = 'Hello world, Hello Bye, Hello Andy'. Затем мы сможем использовать «Hello world» и «Hello Andy», используя preg_match. Любая идея, как мы можем это сделать? Благодаря!

+0

Бывают моменты, когда здравый смысл избивает регулярные выражения, и это один из них. Разделите текст в словах и зацикливайте на них, подсчитывая все совпадения «Hello», за которыми не следует «Bye». Это не задача для регулярных выражений, даже если это легко достижимо. – CodeAngry

ответ

0
$text = 'Hello world, Hello Bye, Hello Andy, Hello'; 
// initialize counters first 
$count_hellos = $count_hello_byes = $count_hello_no_byes = 0; 
// look for Hello - Bye 
if(preg_match_all('~\\bHello\\b~si', $text, $matches)){ 
    $count_hellos = count($matches[0]); 
    unset($matches); 
} 
// look for Hello + Bye 
if(preg_match_all('~Hello\\W+Bye~si', $text, $matches)){ 
    $count_hello_byes = count($matches[0]); 
    unset($matches); 
} 
// do the math 
$count_hello_no_byes = $count_hellos - $count_hello_byes; 
var_dump($count_hello_no_byes); // what you are looking for 

^легко достижимо, как этот!

LEARN MORE HERE о RegEx Сокращенный характер классов.

+0

Спасибо @CodeAngry. Я использовал этот код. –

+0

Кстати, что означает \\ b ~ si? –

+0

@BlueSky '\ b' означает границу слова и включает в себя как'^'(начало), так и' $ '(end). '\ W' означает не символ слова, но не включает'^'и' $ '. – CodeAngry

0

Или как этот

<? 
$text = 'Hello world, Hello Bye, Hello Andy'; 
$a = 'Hello'; 
$b = 'Bye'; 
$counter = 0; 
$words = explode(' ',$text); 
foreach($words as $i => $word){ 
    $word = strtolower(preg_replace('/[^a-z]/i', '', $word)); 
    if($word==strtolower($a) && isset($words[$i+1]) && strtolower(preg_replace('/[^a-z]/i', '', $words[$i+1]))!=strtolower($b)){ 
     $counter++; 
    } 
} 
echo $counter; 
?> 
0

Вы можете использовать negative lookahead

$haystack = 'Hello world, Hello Bye, Hello Andy'; 
$pattern = '/\bHello\W+(?!Bye)(\w+)/'; 
preg_match_all($pattern, $haystack, $m); 
print_r($m[1]); 
/* 
Array 
(
    [0] => world 
    [1] => Andy 
) 
*/ 

если А и значения B являются динамическими, убедитесь, что использовать preg_quote(), чтобы избежать их, прежде чем интерполирования их в строке шаблона.

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