#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*