PHP中如何在多参数场景下提取指定单词前后的特定文本?
PHP中提取指定单词前后的文本(多参数场景)
嘿,我来帮你解决这个字符串提取的问题,这在日常PHP开发里挺常见的,给你整理了两个实用方案,直接看例子就能上手~
方案一:正则表达式(灵活适配复杂场景)
正则是处理这类字符串截取的首选,能精准匹配两个关键词之间的内容,还能应对各种边界情况。
示例1:提取「investor」之后、「harga」之前的文本
原文本:
abstrak investor evaluasi analisis faktor mempengaruhi nilai intrinsik harga saham
代码实现:
$str = "abstrak investor evaluasi analisis faktor mempengaruhi nilai intrinsik harga saham"; $startWord = "investor"; $endWord = "harga"; // 转义关键词避免正则特殊字符干扰 $safeStart = preg_quote($startWord, "/"); $safeEnd = preg_quote($endWord, "/"); // 正则匹配:取startWord后、endWord前的内容(非贪婪模式) preg_match("/{$safeStart}\s*(.*?)\s*{$safeEnd}/", $str, $matches); // 处理匹配结果,避免无匹配时报错 $result = isset($matches[1]) ? trim($matches[1]) : ""; echo $result; // 输出:evaluasi analisis faktor mempengaruhi nilai intrinsik
解释:\s*用来匹配单词前后的空白字符,.*?是非贪婪匹配,确保只取两个目标单词之间的内容,不会多匹配其他部分。
示例2:提取「tersedia」之后、「timbul」之前的文本
原文本:
informasi tersedia investor evaluasi analisis faktor mempengaruhi kondisi perusahaan dimasa investor memperkecil ...
代码实现:
$str = "informasi tersedia investor evaluasi analisis faktor mempengaruhi kondisi perusahaan dimasa investor memperkecil ..."; $startWord = "tersedia"; $endWord = "timbul"; $safeStart = preg_quote($startWord, "/"); $safeEnd = preg_quote($endWord, "/"); // 用正向预查处理endWord不存在的情况,此时取到字符串末尾 preg_match("/{$safeStart}\s*(.*?)\s*(?={$safeEnd}|$)/", $str, $matches); $result = isset($matches[1]) ? trim($matches[1]) : ""; echo $result; // 因原文本无「timbul」,输出到末尾:investor evaluasi analisis faktor mempengaruhi kondisi perusahaan dimasa investor memperkecil ...
方案二:字符串分割(适合简单规整场景)
如果你的字符串结构很简单,没有特殊字符或重复关键词,用explode()分割也能快速实现:
示例1的分割实现:
$str = "abstrak investor evaluasi analisis faktor mempengaruhi nilai intrinsik harga saham"; $startWord = "investor"; $endWord = "harga"; // 先按startWord分割,取后半部分 $afterStart = explode($startWord, $str)[1] ?? ""; // 再按endWord分割,取前半部分 $result = explode($endWord, trim($afterStart))[0] ?? ""; echo trim($result); // 同样得到预期结果
注意:这个方法只匹配关键词第一次出现的位置,且要处理关键词不存在的情况,避免出现Undefined offset错误。
小提醒
- 如果关键词包含正则特殊字符(比如
.、*),一定要用preg_quote()转义,不然正则会失效; - 所有场景都要加边界判断,避免无匹配时出现错误。
内容的提问来源于stack exchange,提问作者Juli Andika
相关产品推荐
相关产品推荐

