php preg_match не возвращает результата

#php #regex

#php #регулярное выражение

Вопрос:

пожалуйста, исправьте меня в моем коде. у меня есть текстовый файл, содержащий ключевые слова.

 example
aaa
aac
aav
aax
asd
fdssa
fsdf
  

и я создал php-файл для поиска.

 <?php
$file = "myfile.txt";
if($file) {
    $read = fopen($file, 'r');
    $data = fread($read, filesize($file));
    fclose($read);

    $im = explode("n", $data);
    $pattern = "/^aa $/i";

    foreach($im as $val) {
        preg_match($pattern, $val, $matches);
    }
}
else {
    echo $file." is not found";
}
?>
<pre><?php print_r($matches); ?></pre>
  

это должно вернуть

 aac
aav
aax
  

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

Комментарии:

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

Ответ №1:

Ваша переменная $matches будет содержать только результат последней попытки сопоставления, поскольку она перезаписывается с каждой foreach итерацией. Кроме того, ^aa $ будут совпадать только строки, состоящие из двух или более a строк.

Чтобы получить соответствие для строк, которые начинаются только с aa , вместо этого используйте just ^aa . И если вам нужны все совпадающие строки, вам нужно собрать их в другой массив:

 foreach ($im as $val) {
    if (preg_match('/^aa/', $val, $match)) {
        $matches[] = $match;
    }
}
  

Вы также могли бы использовать file и preg_grep :

 $matches = preg_grep('/^aa/', file($file));
  

Комментарии:

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

Ответ №2:

Код:

 <?php
$filePathName = '__regexTest.txt';

if (is_file($filePathName)) {

    $content = file_get_contents($filePathName);

    $re = '/
        b          # begin of word
        aa          # begin from aa
        .*?         # text from aa to end of word
        b          # end of word
        /xm';       //  m - multiline search amp; x - ignore spaces in regex 

    $nMatches = preg_match_all($re, $content, $aMatches);
}
else {
    echo $file." is not found";
}
?>
<pre><?php print_r($aMatches); ?></pre>
  

Результат:

 Array
(
    [0] => Array
        (
            [0] => aaa
            [1] => aac
            [2] => aav
            [3] => aax
        )

)
  

Это будет работать также для

 aac  aabssc
aav
  

Комментарии:

1. $re = '/baaB*/' этого достаточно, вам нужно только m использовать ^ и $ для сопоставления начала и конца строк.

2. @Lucas: проверьте, пожалуйста, ваше регулярное выражение не работает в PHP. Проблема с B*