如何使用PHP在单词之间找到单词

时间:2015-08-18 12:41:53

标签: php regex string

您好我有html文件我想在匹配位置找到单词赞

  

您好,我的名字是吉姆。您好,我的名字是艾玛。你好,我的名字是测试。

我想要做的是在my name is之后和.之前回复单词(DOT)我有这个php函数但它只会回应名字jim如何循环

<?php

$data = file_get_contents("test.html");

$name = cut_str($data,'my name is ','.');
echo $name;


function cut_str($str, $left, $right){
    $str = substr(stristr($str, $left), strlen($left));
    $leftLen = strlen(stristr($str, $right));
    $leftLen = $leftLen ? -($leftLen) : strlen($str);
    $str = substr($str, 0, $leftLen);
    return $str;
}

?>

2 个答案:

答案 0 :(得分:1)

这应该这样做。

$name = preg_match_all('~My name is (.+?)\.~', $data, $names);
print_r($names[1]);

.是任何角色。

+是一个或多个字符。

?会在第一个.停止匹配。

~是分隔符,告诉正则表达式停止和启动的位置。

PHP演示:https://eval.in/418218

Regex101演示:https://regex101.com/r/dO8mQ4/1

根据您想要的宽松程度或严格程度,您可能需要修改器。

你可以做到

$name = preg_match_all('~My\s+name\s+is\s+(.+?)\.~i', $data, $names);
print_r($names[1]);

这允许每个单词之间有一个或多个空格(制表符,换行符,空格)(\ s +),并使单词不区分大小写(分隔符后为i)。

答案 1 :(得分:0)

您可以将preg_match_all用作

preg_match_all('/(?<=(my name is))(.*?)(?=(\.))/i', 'Hello my name is jim. Hello my name is emma. hello my name is test.',$res);
print_r($res[0]);

<强>解释

  • (?<=(my name is))积极向后看 - 捕捉小组(my name is) my name is字面匹配字符my name is
  • .*?匹配任何字符(换行符除外)
  • (?=(\.))肯定前瞻 - \.字面匹配字符.
  • i modifier:不敏感。不区分大小写的匹配(ignores case of [a-zA-Z])

或者您也可以将其用作

preg_match_all('/my\sname\sis(.*?)\./i', 'Hello my name is jim. Hello my name is emma. hello my name is test.',$res);
print_r($res[1]);

Demo