2016-08-19 2 views
0

У меня есть текст, который включает в себя всевозможные специальные символы, и мне нужно найти первое соответствие для строки, а затем вернуть что-то вроде этого 10 символов + сначала матч + 10 символов. Другими словами, образец текста, где первое совпадение находится посередине.Найти первое совпадение строки в тексте и вернуть образец исходного текста

Пример:

$text = "+!This is a text with some % special chars/text and (for a string query to match. Then !! mor&&&e and so on...chars/text."; 
$stringToFind = "hars/t"; 

Она должна возвращать:

$grabtext = "% special chars/text and (for"; 

Я сделал пример строки, чтобы найти, что это не полное слово и имеет 1 специальный символ.

+0

Вы пытались использовать str_pos()? Он дает вам положение первого совпадения в строке. Затем вы можете угадать позицию первого символа, который хотите распечатать, и последний ... – Random

ответ

1

From the PHP manual

strpos - Находит позицию первого вхождения подстроки в строке

Так что, если мы используем эту функцию, чтобы определить местонахождение смещение подстроки мы можем легко использовать что-то вроде substr, чтобы получить подстроку 10 символов +/- из этого смещения.

function grabText($string, $searchString) { 
    if (($x = strpos($string, $searchString)) === false) { 
     return; // no match found 
    } 
    $y = strlen($searchString) + 20; 
    $x = max(0, $x - 10); 
    return substr($string, $x, $y); 
} 

$text = "+!This is a text with some % special chars/text and (for a string query to match. Then !! mor&&&e and so on...chars/text."; 
$stringToFind = "hars/t"; 
echo grabText($text, $stringToFind); // special chars/text and ( 
+0

Спасибо, Шериф, отличная функция, которая действительно делает то, что мне нужно! –

1

Это можно сделать с помощью регулярного выражения. A . - любой символ (исключая новые строки), {} - лимит символов или диапазон. В этом случае мы допустим 10 символов, .{10}.

~(.{10}hars/t.{10})~ 

Regex Демо: https://regex101.com/r/iR3pA6/1

PHP Демо: https://3v4l.org/UBKIS

Использование:

$text = "+!This is a text with some % special chars/text and (for a string query to match. Then !! mor&&&e and so on...chars/text."; 
$stringToFind = "hars/t"; 
preg_match('~.{10}' . preg_quote($stringToFind, '~') . '.{10}~', $text, $match); 
print_r($match); 

ПримечаниеЭтот special c составляет 10 символов, hars/text ваш матч, и ext and ( является дополнительным 10 персонажи. Найденная строка или описание отключены.

возвращение что-то вроде этого 10 символов + первый матч + 10 символов

Update, чтобы Шифрование до 10 символов использовать:

$text = "+!This is a text with some % special chars/text and (for a string query to match. Then !! mor&&&e and so on...chars/text."; 
$stringToFind = "hars/t"; 
preg_match('~.{0,10}' . preg_quote($stringToFind, '~') . '.{0,10}~', $text, $match); 
print_r($match); 

Демо: https://regex101.com/r/iR3pA6/2

+0

Спасибо Крису ... у вас есть предложение, если мой stringToFind находится в начале или конце (например:!). Отлично работает, если строка посередине или, по крайней мере, достаточно 10 символов в каждой стороне. (Я мог добавить 10 дополнительных мест в исходном тексте в начале и в конце, а затем обрезать конечный результат, но кажется каким-то не очень красивым). Как вы думаете? –

+0

Вы можете изменить диапазон, чтобы сделать '10' дополнительной длиной. '(. {0,10} hars/t. {0,10})' Разрешит 0-10 символов перед совпадением и/или после. Демонстрация 2: https://regex101.com/r/iR3pA6/2 Здесь вы можете прочитать больше, http://www.regular-expressions.info/repeat.html см. «Ограничение повторения». – chris85

+0

Спасибо Крису и за демо. Я действительно должен больше читать о регулярных выражениях, но мой php очень ограничен. –