#php #regex #search
#php #регулярное выражение #Поиск
Вопрос:
У меня возникли проблемы с написанием php-функции для поиска определенного текста в php-файле. Я не силен в регулярных выражениях, поэтому думаю, что в этом проблема.
Мне нужно, чтобы регулярное выражение содержало начальное и конечное слова и должно возвращать текст, найденный между ними. Это то, что я пробовал:
$handle1 = fopen($file, "r");
$fileContents = fread($handle1,filesize($file));
if (preg_match('/'.$start. '((.|n)*)'. $end.'/', $fileContents, $match)) {
$text=preg_split('/'.$start.'((.|n)*)'. $end.'/', $match[0]);
echo $text. " found in $file<br/>";
}
Кто-нибудь может помочь, пожалуйста?
Комментарии:
1. Можете ли вы привести пример примерного ввода и каким вы ожидаете получить результат?
2. В качестве дополнительного комментария, я предполагаю, что вам нужно наименьшее возможное совпадение. Если это так, вам нужно сделать совпадение нежадным :
(.|n)*?
. Кроме того, будьте осторожны со строками$start
и$end
, которые могут содержать специальные символы регулярного выражения.3. Каково содержимое
$start
и$end
?4. @krookedking Я хочу выполнить поиск по всему файлу и вернуть результат, даже если есть новые строки.
5. @Femi Я не получаю ошибку, но я не могу получить желаемый результат.
Ответ №1:
<?php
$str = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. ...';
$start = 'sadipscing';
$end = 'dolore';
$pattern = sprintf(
'/%s(. ?)%s/ims',
preg_quote($start, '/'), preg_quote($end, '/')
);
if (preg_match($pattern, $str, $matches)) {
list(, $match) = $matches;
echo $match;
}
Где $str
должно быть содержимое вашего файла.
Взгляните на: http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php для модификаторов i
, m
и s
.
Комментарии:
1. @Songo Теперь это будет. Смотрите
s
модификатор. (последняя строка ответа)
Ответ №2:
Для этого вам не нужно регулярное выражение.
function getText($string, $start, $end)
{
$text = "";
$posStart = strrpos($string, $start);
$posEnd = strrpos($string, $end, $posStart);
if($posStart > 0 amp;amp; $posEnd > 0)
{
$text = substr($string, $posStart, strlen($string) - $posEnd));
}
return $text;
}
Надеюсь, это поможет.
Ответ №3:
Мне нравятся эти два решения
function GetBetween($content,$start,$end)
{
$r = explode($start, $content);
if (isset($r[1])){
$r = explode($end, $r[1]);
return $r[0];
}
return '';
}
function get_string_between($string, $start, $end){
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini = strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}
Я также сделал несколько тестов с обоими решениями выше, и оба дают почти одинаковое время. Вы также можете протестировать его. Я предоставил обеим функциям файл для чтения, в котором было около 60000 символов (проверено с помощью Ms Word количество слов), и обе функции потратили на поиск около 0,00099 секунды.
$startTime = microtime(true);
GetBetween($str, '<start>', '<end>');
echo "Explodin Function took: ".(microtime(true) - $startTime) . " to finish<br />";
$startTime = microtime(true);
get_string_between($str, '<start>', '<end>');
echo "Subsring Function took: ".(microtime(true) - $startTime) . " to finish<br />";