如何从以数组中列出的子字符串结尾的字符串中提取单词?

时间:2017-08-04 02:37:57

标签: php filtering substring

如何打印字符串中包含特定字母的所有单词,例如:

$words = "lernen spielen betteln lachen example"; 
$EndsWith=['en','eln'];

在这个示例中,除了单词示例之外,应该打印所有内容。

我只知道如何找到substr的字符,但这只适用于字符串中的最后一个字。

3 个答案:

答案 0 :(得分:3)

您可以使用正则表达式:

([A-Za-z]+(?:en|eln))\b

找到以eneln结尾的单词,假设您认为某个单词只包含alpha ascii字符。您可以修改字符类以包含更多" word"字符。

正则表达式演示:https://regex101.com/r/7i5iS8/1/

PHP用法:

$words = "lernen spielen betteln lachen example"; 
$EndsWith=['en','eln'];
preg_match_all('/([A-Za-z]+(?:' . implode('|', array_map('preg_quote', $EndsWith)) . '))\b/', $words, $words_that_end);
print_r($words_that_end[1]);

此处的preg_quote包含$EndsWith中的任何值都包含保留的正则表达式字符,例如.。如果您将.传递给正则表达式,则字符表示任何不是新行的单个字符,而您确实需要文字.。在正则表达式中,它必须是\.[.];这个函数适合你(它使用\.语法)。

如果$EndsWith中的所有字符始终为字母,则您不需要该功能。下面的演示显示了不使用它的用法。

演示:https://3v4l.org/deBUD

此答案还假定eneln不是单词。

答案 1 :(得分:0)

您可以使用preg_split将字符串拆分为数组。

$words = preg_split('/\s+/', 'lernen spielen betteln lachen example');

这将生成数组:

Array (
    [0] => lernen
    [1] => spielen
    [2] => betteln
    [3] => lachen
    [4] => example
)

从那里你可以迭代数组,并检查每个单词是否以$endsWith元素之一结束。

$wordsThatEndWith = [];

foreach ($words as $word) {
    foreach ($endsWith as $endWith) {
        if (substr($word, -strlen($endWith)) === $endWith) {
            $wordsThatEndWith[] = $word;
        }
    }
}

$wordsThatEndWith现在将是一个数组,其中包含以任何元素结尾的所有单词:

Array
(
    [0] => lernen
    [1] => spielen
    [2] => betteln
    [3] => lachen
)

答案 2 :(得分:0)

按空格分解字符串以分别获取每个单词,然后迭代然后检查它是否以数组中的某些内容结束。

$words = explode(' ', $words);
foreach($words as $word) {
    foreach($EndsWith as $end) {
        if(substr($word, -strlen($end)) === $end) {
            echo $word;
        }
    }
}