Php 如何在不包含HTML标记的搜索词周围裁剪文本

Php 如何在不包含HTML标记的搜索词周围裁剪文本,php,html,Php,Html,我有一个包含HTML和文本的字符串,还有一个搜索词。 我想在$searchword周围找到一些裁剪过的文本 示例文本: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <sometag>At</sometag>

我有一个包含HTML和文本的字符串,还有一个搜索词。 我想在$searchword周围找到一些裁剪过的文本

示例文本:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <sometag>At</sometag> vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Lorem ipsum door sit amet,consetetur sadipscing eliter,sed diam nonumy eirmod temporal invidund ut labour and dolore magna aliquyam erat,sed diam voluptua。在vero eos和accusam以及justo duo dolores和ea Reum。斯泰特·克莱塔·卡斯德·古伯格伦(Stet clita kasd gubergren),没有海洋保护区是属于同一领域的。
如果$searchword为“vero”,则输出:

…sed diam voluptua。在veroeos和accusam等。。。
所以我想在搜索词前后加X字符,不包括HTML。 我不知道如何开始。我知道我们可能需要一个substr函数和一个regex,但我被卡住了。

//要搜索的字符串
// The string to search in
$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis ex.';

// The text to search
$search_query = 'consectetur';

// The regular expression
// Note that I’m using preg_quote() to make sure the text doesn’t conflict with the regular expression
// This expression matches 3 words (punctuation included) before and after the searched keyword
$search = '/((\w+[^\w]+){3})(' . preg_quote($search_query) . ')(([^\w]+\w+){3})/i';

// Find all matches of the expression, and store it in $matches
preg_match($search, $text, $matches);

// Use the results to generate the string you desire.
$result = sprintf('...%s<strong>%s</strong>%s...', $matches[1], $matches[3], $matches[4]);
$text='Lorem ipsum door sit amet,concetetur adipsum elit。酒后驾车; //要搜索的文本 $search_query='concertetur'; //正则表达式 //请注意,我使用preg_quote()确保文本不会与正则表达式冲突 //此表达式匹配搜索关键字前后的3个单词(包括标点符号) $search='/((\w+[^\w]+){3})('.preg_quote($search\u query)。'([^\w]+\w+{3})/i'; //查找表达式的所有匹配项,并将其存储在$matches中 预匹配($search,$text,$matches); //使用结果生成所需的字符串。 $result=sprintf(“…%s%s%s…”,$matches[1],$matches[3],$matches[4]);
//要搜索的字符串
$text='Lorem ipsum door sit amet,concetetur adipsum elit。酒后驾车;
//要搜索的文本
$search_query='concertetur';
//正则表达式
//请注意,我使用preg_quote()确保文本不会与正则表达式冲突
//此表达式匹配搜索关键字前后的3个单词(包括标点符号)
$search='/((\w+[^\w]+){3})('.preg_quote($search\u query)。'([^\w]+\w+{3})/i';
//查找表达式的所有匹配项,并将其存储在$matches中
预匹配($search,$text,$matches);
//使用结果生成所需的字符串。
$result=sprintf(“…%s%s%s…”,$matches[1],$matches[3],$matches[4]);
//要搜索的字符串
$text='Lorem ipsum door sit amet,concetetur adipsum elit。酒后驾车;
//要搜索的文本
$search_query='concertetur';
//正则表达式
//请注意,我使用preg_quote()确保文本不会与正则表达式冲突
//此表达式匹配搜索关键字前后的3个单词(包括标点符号)
$search='/((\w+[^\w]+){3})('.preg_quote($search\u query)。'([^\w]+\w+{3})/i';
//查找表达式的所有匹配项,并将其存储在$matches中
预匹配($search,$text,$matches);
//使用结果生成所需的字符串。
$result=sprintf(“…%s%s%s…”,$matches[1],$matches[3],$matches[4]);
//要搜索的字符串
$text='Lorem ipsum door sit amet,concetetur adipsum elit。酒后驾车;
//要搜索的文本
$search_query='concertetur';
//正则表达式
//请注意,我使用preg_quote()确保文本不会与正则表达式冲突
//此表达式匹配搜索关键字前后的3个单词(包括标点符号)
$search='/((\w+[^\w]+){3})('.preg_quote($search\u query)。'([^\w]+\w+{3})/i';
//查找表达式的所有匹配项,并将其存储在$matches中
预匹配($search,$text,$matches);
//使用结果生成所需的字符串。
$result=sprintf(“…%s%s%s…”,$matches[1],$matches[3],$matches[4]);

步骤1:删除HTML标记。步骤2:包装出现的搜索词

$text = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <sometag>At</sometag> vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.';

$plainText = strip_tags($text);

$resultText = str_replace($searchword, '<strong>' . $searchword . '</strong>', $plainText);
$text='Lorem ipsum door sit amet,consetetur sadipscing eliter,sed diam nonumy eirmod temporal invidunt ut labor et dolore magna aliquyam erat,sed diam voluptua。在vero eos和accusam以及justo duo dolores和ea Reum。斯特特·克里塔·卡斯德·古伯格伦(Stet clita kasd gubergren),没有海洋保护区,也没有海洋保护区;
$plainText=带标签($text);
$resultText=str_replace($searchword,。$searchword.,$plainText);

步骤1:删除HTML标记。步骤2:包装出现的搜索词

$text = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <sometag>At</sometag> vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.';

$plainText = strip_tags($text);

$resultText = str_replace($searchword, '<strong>' . $searchword . '</strong>', $plainText);
$text='Lorem ipsum door sit amet,consetetur sadipscing eliter,sed diam nonumy eirmod temporal invidunt ut labor et dolore magna aliquyam erat,sed diam voluptua。在vero eos和accusam以及justo duo dolores和ea Reum。斯特特·克里塔·卡斯德·古伯格伦(Stet clita kasd gubergren),没有海洋保护区,也没有海洋保护区;
$plainText=带标签($text);
$resultText=str_replace($searchword,。$searchword.,$plainText);

步骤1:删除HTML标记。步骤2:包装出现的搜索词

$text = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <sometag>At</sometag> vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.';

$plainText = strip_tags($text);

$resultText = str_replace($searchword, '<strong>' . $searchword . '</strong>', $plainText);
$text='Lorem ipsum door sit amet,consetetur sadipscing eliter,sed diam nonumy eirmod temporal invidunt ut labor et dolore magna aliquyam erat,sed diam voluptua。在vero eos和accusam以及justo duo dolores和ea Reum。斯特特·克里塔·卡斯德·古伯格伦(Stet clita kasd gubergren),没有海洋保护区,也没有海洋保护区;
$plainText=带标签($text);
$resultText=str_replace($searchword,。$searchword.,$plainText);

步骤1:删除HTML标记。步骤2:包装出现的搜索词

$text = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <sometag>At</sometag> vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.';

$plainText = strip_tags($text);

$resultText = str_replace($searchword, '<strong>' . $searchword . '</strong>', $plainText);
$text='Lorem ipsum door sit amet,consetetur sadipscing eliter,sed diam nonumy eirmod temporal invidunt ut labor et dolore magna aliquyam erat,sed diam voluptua。在vero eos和accusam以及justo duo dolores和ea Reum。斯特特·克里塔·卡斯德·古伯格伦(Stet clita kasd gubergren),没有海洋保护区,也没有海洋保护区;
$plainText=带标签($text);
$resultText=str_replace($searchword,。$searchword.,$plainText);

Tim的解决方案运行良好,但这里有一个稍微不同的解决方案,它匹配给定单词前的m个字符和后的n个字符,而不是n个单词:

$string = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <sometag>At</sometag> vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";
$string = strip_tags($string); // strip html tags
$word = 'vero';
$replace = "<strong>$word</strong>";
$before = 22; // characters to match before word
$after = 7; // characters to match after word

preg_match('/(.){'.$before.'}'.$word.'(.){'.$after.'}/', $string, $matches);

echo '...' . preg_replace('/'.$word.'/', '<strong>'.$word.'</strong>', $matches[0]) . '...';
// returns "...sed diam voluptua. At <strong>vero</strong> eos et..." for $before = 22 and $after = 7