在文本中查找字符串的第一个匹配项并返回原始文本的样本

时间:2016-08-19 15:02:27

标签: php regex string replace substr

我有一个包含各种特殊字符的文本,我需要找到字符串的第一个匹配,然后返回类似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";

我做了一个字符串示例,发现这不是一个完整的单词,并且有一个特殊的字符。

2 个答案:

答案 0 :(得分:1)

这可以使用正则表达式完成。 .是任何字符(不包括新行),{}是字符数限制或范围。在这种情况下,我们允许10个任意字符.{10}

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

正则表达式演示: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个字符

更新,允许最多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

答案 1 :(得分: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 (