我有一个包含各种特殊字符的文本,我需要找到字符串的第一个匹配,然后返回类似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";
我做了一个字符串示例,发现这不是一个完整的单词,并且有一个特殊的字符。
答案 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);
答案 1 :(得分:1)
中第一次出现子字符串的位置
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 (