PHP提取文本中Mark的所有关联短语问题求助
解决PHP提取所有Mark相关短语的问题
原代码只能提取第一条Mark相关内容,是因为只执行了一次strpos查找,没有循环处理所有匹配项。下面提供两种可行的解决方法:
方法一:正则表达式(推荐)
利用preg_match_all全局匹配所有符合条件的内容,适合处理这类有固定起始和结尾的文本提取场景:
<?php $data = " Peter, <br> please check your email for a document I sent, thanks.<br> Mark, <br> please I need you to fix my Toyota Camry, thanks. <br> Mark, <br> please go and pick up the kids from school, thanks. <br> Jane, <br> please go the shop and some items for the house, thanks. "; // 全局匹配所有从Mark,到thanks.的内容,s修饰符允许跨多行匹配 preg_match_all('/Mark,.*?thanks\./s', $data, $matches); // 将匹配到的结果拼接成字符串 $result = implode(' ', $matches[0]); // 可选:去除文本中的<br>标签 $result = str_replace('<br>', '', $result); echo $result; ?>
正则说明
Mark,:匹配起始标识.*?:非贪婪模式匹配中间任意内容,避免把多个Mark的消息合并成一条thanks\.:匹配结尾标识(.是正则特殊字符,需转义)s:修饰符让.可以匹配换行符,支持跨多行提取
方法二:循环查找(无正则)
如果不想使用正则,可以通过循环调用strpos,逐步定位所有匹配项:
<?php $data = " Peter, <br> please check your email for a document I sent, thanks.<br> Mark, <br> please I need you to fix my Toyota Camry, thanks. <br> Mark, <br> please go and pick up the kids from school, thanks. <br> Jane, <br> please go the shop and some items for the house, thanks. "; $start = 'Mark'; $end = 'thanks.'; $results = []; $currentPos = 0; // 循环查找所有Mark的位置 while (($startIndex = strpos($data, $start, $currentPos)) !== false) { // 找到当前Mark对应的结尾位置 $endIndex = strpos($data, $end, $startIndex); if ($endIndex === false) break; // 找不到结尾则退出循环 $endIndex += strlen($end); // 截取当前Mark的消息内容 $result = substr($data, $startIndex, $endIndex - $startIndex); $results[] = $result; // 更新起始位置,避免重复匹配同一段内容 $currentPos = $endIndex; } // 拼接所有结果 $finalResult = implode(' ', $results); // 可选:去除<br>标签 $finalResult = str_replace('<br>', '', $finalResult); echo $finalResult; ?>
输出结果
两种方法执行后都会得到期望的输出:Mark, please I need you to fix my Toyota Camry, thanks. Mark, please go and pick up the kids from school, thanks.
内容的提问来源于stack exchange,提问作者Uzngoka
相关产品推荐
相关产品推荐

