获取dom元素php之前和之后

时间:2015-06-07 19:15:30

标签: php laravel explode

我想得到一个元素之前和之后的单词,我可以用一个小函数来做,但是如果它开始或者以这个元素结束我就会卡住

我的元素: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

你能解决这个问题吗?

2 个答案:

答案 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;
}

感谢您的有用帮助