我想得到一个元素之前和之后的单词,我可以用一个小函数来做,但是如果它开始或者以这个元素结束我就会卡住
我的元素:a [id = 2] 我的文字:
bla bla bla bla <a id="2">My link</a> blu blu blu
根据这个问题extract part of a string before and after a word我创建了一个小脚本,可以得到类似的链接:
$left = substr($tab[0], -10);
$right = substr($right, 1, 10);
$text = "... $left $query $right ...";
它返回:
'... bla bla <a id="2">My link</a> blu blu ...'
但是当我搜索时:
<a id="2">My link</a> bla bla bla bla blu blu blu
or
bla bla bla bla blu blu blu <a id="2">My link</a>
explode()函数只返回一个数组,因为在分隔符之前/之后没有任何内容...我有错误“未定义的偏移:1 ”
你能解决这个问题吗?答案 0 :(得分:0)
Suppouse,$dom
包含DomDocument
。然后创建xpath - 获取元素的文本,该元素是标记<a id=2...
的父元素如果parent
仅包装一个a
标记而不是$ text将是包含两个对象的数组 - 文本之前和文本之后,如果包含更多元素,则数组将包含许多部分,但您可以将它们组合在一起。
$xpath = new DOMXpath($dom);
$texts = $xpath->query('//a[@id="2"]/../text()');
$text = array();
foreach($texts as $t) $text[] = $t->nodeValue;
echo implode(' ', $text);
答案 1 :(得分:0)
对于那些感兴趣的人,我找到了一个适合我的解决方案,无论查询是在字符串的开头中间还是在字符串的末尾。
function extract_before_after($str, $query)
{
$expl = explode($query, $str);
// if $query is at the begin
if(isset($expl[0]) && strlen($expl[0]) === 0){
$before = '...';
$after = substr($expl[1], 0, 100) . '...';
$new_text = $before . ' ' . $query . ' ' . $after;
}
// if $query is at the end
elseif(isset($expl[1]) && strlen($expl[1]) === 0){
$before = substr($expl[0], -100) . '...';
$after = '...';
$new_text = $before . ' ' . $query . ' ' . $after;
}
// if $query is in middle
elseif(
(isset($expl[0]) && strlen($expl[0]) > 0)
&& (isset($expl[1]) && strlen($expl[1]) > 0)
){
$before = '...' . substr($expl[0], -100);
$after = substr($expl[1], 0, 100) . '...';
$new_text = $before . ' ' . $query . ' ' . $after;
}
// if $query not found...
else{
$new_text = '... nothing ...';
}
return $new_text;
}
感谢您的有用帮助