Поиск в текстовом файле с использованием php - PullRequest
3 голосов
/ 08 июня 2019

Я пытаюсь найти "привет" и получить все фразы / предложения, которые находятся между "----"

//in my text file 
$txt="
----hello, how are you----
----how are you,hello, how are you----
----how are you hello, how are you----
----hello how are you , how are you----
----how are you , how are you----

"

Как я могу получить все строки между ---- если hello слово есть в нем?

мой код

$re = '/(?=.*hello)(----.+?----)/m';
$fh = fopen('ara.txt', 'r') or die($php_errormsg); 
while (!feof($fn)) { 
$line = fgets($fn, 4096);

preg_match_all($re, $line, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);
}

Ответы [ 4 ]

1 голос
/ 08 июня 2019

Вам не нужен позитивный взгляд (?=.*hello, чтобы утверждать, что то, что следует, привет.

Вы можете использовать группу захвата с не жадным соответствием .*?, чтобы предотвратить переопределение и поместить hello между границами слов \b:

----(.*?\bhello\b.*?)----

См. regex demo

Ваши значения будут в первой группе захвата.

1 голос
/ 08 июня 2019

Это проще, как это

$txt="
----hello, how are you----
----how are you,hello, how are you----
----how are you hello, how are you----
----hello how are you , how are you----
----how are you , how are you----

";

preg_match_all('/\-\-\-\-(.*hello.*)\-\-\-\-/', $txt, $matches);

print_r($matches[1]);

Array ( [0] => hello, how are you [1] => how are you,hello, how are you [2] => how are you hello, how are you [3] => hello how are you , how are you )
1 голос
/ 08 июня 2019

Если бы все наши строки имели ----, мы просто использовали бы это выражение:

(?=.*hello).*

Тест

$re = '/(?=.*hello).*/m';
$str = '----hello, how are you----
----how are you,hello, how are you----
----how are you hello, how are you----
----hello how are you , how are you----
----how are you , how are you----
';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

Демонстрация 1

Если нет, и нам нужно проверить ----, мы бы расширили наше выражение до:

(?=.*hello)(----.+?----)

Тест

$re = '/(?=.*hello)(----.+?----)/m';
$str = '----hello, how are you----
----how are you,hello, how are you----
----how are you hello, how are you----
----hello how are you , how are you----
----how are you , how are you----
---hello how are you , how are you---
';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

Демонстрация 2

RegEx

Если это выражение нежелательно и вы хотите изменить его, перейдите по этой ссылке на regex101.com .

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

И наш код может выглядеть следующим образом:

$re = '/(?=.*hello)(----.+?----)/m';
$fh = fopen('/path/to/our/file/ara.txt', 'r') or die($php_errormsg);
while (!feof($fh)) {
    $line = fgets($fh, 4096);
    preg_match_all($re, $line, $matches, PREG_SET_ORDER, 0);
    var_dump($matches);
}
1 голос
/ 08 июня 2019

Попробуйте preg_match_all функция

    //in my text file
    $txt = "
----hello, how are you----
----how are you,hello, how are you----
----how are you hello, how are you----
----hello how are you , how are you----
----how are you , how are you----";

    $pattern = "/[^\\n]*hello[^\\n]*/";
    preg_match_all($pattern,$txt, $matches, PREG_OFFSET_CAPTURE);

    $final = [];
    foreach($matches[0]??[] as $match){
        $final[] = str_replace('----','',$match[0]);
    }
    print_r($final);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...