您好我有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;
}
?>
答案 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]);