Tôi đang cố gắng tìm một regex được tối ưu hóa để trả về các từ N (nếu có) xung quanh từ khác để tạo bản tóm tắt. Chuỗi nằm trong UTF-8, do đó định nghĩa "từ" lớn hơn [a-z]. Chuỗi có vai trò là từ tham chiếu có thể ở giữa một từ hoặc không được bao quanh bởi dấu cách.Tối ưu hóa regex cho N từ xung quanh một từ đã cho (UTF-8)
Tôi đã nhận được những điều sau đây mà làm việc nhưng dường như thực sự tham lam và nghẹn khi tìm kiếm hơn 6-7 từ xung quanh nhau:
/(?:[^\s\r\n]+[\s\r\n]+[^\s\r\n]*){0,4}lorem(?:[^\s\r\n]*[\s\r\n]+[^\s\r\n]+){0,4}/u
Đây là phương pháp PHP tôi đã xây dựng để làm nhưng tôi cần được giúp đỡ để regex ít tham lam hơn và làm việc cho bất kỳ số từ nào xung quanh.
/**
* Finds N words around a specified word in a string.
*
* @param string $string The complete string to look in.
* @param string $find The string to look for.
* @param integer $before The number of words to look for before $find.
* @param integer $after The number of words to look for after $find.
* @return mixed False if $find was not found and all the words around otherwise.
*/
private function getWordsAround($string, $find, $before, $after)
{
$matches = array();
$find = preg_quote($find);
$regex = '(?:[^\s\r\n]+[\s\r\n]+[^\s\r\n]*){0,' . (int)$before . '}' .
$find . '(?:[^\s\r\n]*[\s\r\n]+[^\s\r\n]+){0,' . (int)$after . '}';
if (preg_match("/$regex/u", $string, $matches)) {
return $matches[0];
} else {
return false;
}
}
Nếu tôi có $ string sau:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor,
felis non vehicula suscipit, enim quam adipiscing turpis, eget rutrum
eros velit non enim. Sed commodo cursus vulputate. Aliquam id diam sed arcu
fringilla venenatis. Cras vitae ante ut tellus malesuada convallis. Vivamus
luctus ante vel ligula eleifend condimentum. Donec a vulputate velit.
Suspendisse velit risus, volutpat at dapibus vitae, viverra vel nulla."
Và gọi getWordsAround($string, 'vitae', 8, 8)
Tôi muốn để có được những kết quả sau:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras auctor,
felis non vehicula suscipit,"
Cảm ơn bạn đã rất kinh nghiệm regex giúp đỡ của bạn.
Đối với người mới bắt đầu, '\ s' bao gồm' \ r' và '\ n', vì vậy việc thêm chúng vào cùng một lớp ký tự là thừa. Ngoài ra '[^ \ s]' tương đương với '\ S' – NullUserException
Mẹo được lưu ý, cảm ơn NullUserException. – lpfavreau
Đây là một vấn đề thú vị bằng cách này. Khi tôi trở lại tôi sẽ cố gắng và đưa ra một giải pháp tốt hơn. +1 – NullUserException