regex 在分隔字符串中的搜索值之前查找值

6l7fqoea  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(107)

我有以下文本字符串:“园艺,园林绿化,足球,3D建模”
我需要PHP挑出 * 之前的字符串 * 短语,“足球"。
因此,无论干草堆的大小如何,代码将始终扫描短语'Football'并检索紧挨着它的文本。
以下是我到目前为止的尝试:

$haystack = "Swimming,Astronomy,Gardening,Rugby,Landscaping,Football,3D Modelling";
$find = "Football";
$string = magicFunction($find, $haystack);
echo $string; // $string would = 'Landscaping'
ui7jx7zq

ui7jx7zq1#

$terms = explode(',', $array);
$index = array_search('Football', $terms);
$indexBefore = $index - 1;

if (!isset($terms[$indexBefore])) {
    trigger_error('No element BEFORE');
} else {
    echo $terms[$indexBefore];
}
2cmtqfgy

2cmtqfgy2#

//PHP 5.4
echo explode(',Football', $array)[0]

//PHP 5.3-
list($string) = explode(',Football', $array);
echo $string;
cmssoen2

cmssoen23#

$array = array("Swimming","Astronomy","Gardening","Rugby","Landscaping","Football","3D" "Modelling");
$find = "Football";
$string = getFromOffset($find, $array);
echo $string; // $string would = 'Landscaping'

function getFromOffset($find, $array, $offset = -1)
{
    $id = array_search($find, $array);
    if (!$id)
        return $find.' not found';
    if (isset($array[$id + $offset]))
        return $array[$id + $offset];
    return $find.' is first in array';
}

也可以将偏移设置为与上一个偏移不同。

368yc8dk

368yc8dk4#

您可以避免将分隔字符串拆分为数组的操作,而只需使用正则表达式提取搜索词之前的词。
preg_quote()实际上并不需要与您的示例搜索词一起使用,但如果该词来自不受信任的来源,则是一个好主意。
代码:(Demo

var_export(
    preg_match(
        '#[^,]+(?=,' . preg_quote($find) . ')#',
        $string,
        $m
    )
    ? $m[0]
    : null
);

如果未找到搜索项或没有前一项,则返回null。如果需要强制执行全字匹配,可以使用add (?:$|,) to the end of the lookahead

相关问题