使用PHP,当我只知道“ aaa”时,如何从“ string1 string2 aaa-bbb string3”中获取子字符串“ aaa-bbb”?

时间:2019-11-23 17:31:10

标签: php regex xpath

希望我的问题有道理。

假设您有一个类名

class = "class-1 class-2-something topic-exercise class-3-somemoretext"

有时此类中的一个字符串沿topic-bbb行。我通过xpath在PHP中获得了这样的元素

$contenttypes = $xpath->query("//*[contains(@class, 'topic')]");

但是接下来我需要获取字符串的其余部分。因此,如果我有topic-exercise,我需要得到exercise。我可以从exercise轻松获得topic-exercise,因此实际上归结于提取topic-exercise

好奇是否有一些xpath查询可以轻松地做到这一点。

谢谢! 布莱恩

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您将能够获得整个字符串,因此您仅需要帮助即可从中提取所需内容,在这种情况下,这应该有所帮助:

<?php 

$string = "class-1 class-2-something topic-exercise class-3-somemoretext topic-more";

preg_match_all('/topic-(\S*)\s?/', $string, $matches);

echo "<pre>";
print_r($matches[1]);
echo "</pre>";

?>

输出:

Array
(
    [0] => exercise
    [1] => more
)

// EDIT

不使用正则表达式来解决此问题的一种方法是将字符串拆分为每个类,然后检查类是否具有连字符,并通过该字符串拆分字符串,如果左侧是您要查找的关键字(主题),那么正确的部分就是您想要的部分,就像这样:

<?php 

$string = "class-1 class-2-something topic-exercise class-3-somemoretext something topic-more";

function get_topics($str, $prefix = 'topic') {
    $matches = [];
    $classes = explode(' ', $str);
    foreach($classes as $class) {
        if(strpos($class, '-') !== false) {
            list($pre, $post) = explode('-', $class);
            if($pre == $prefix && !empty($post)) {
                array_push($matches, $post);
            }
        }
    }
    return $matches;
}

echo "<pre>";
print_r( get_topics($string) );
echo "</pre>";

?>