PHP正则表达式提取除换行(\n)和制表符(\t)外的内容到数组
解决PHP中提取含大量换行/制表符文本的有效内容问题
嘿,我明白你要处理的这个文本提取需求了——那些多余的换行和制表符确实烦人,而且之前的正则没搞定对吧?别担心,我给你两个靠谱的PHP解决方案,都能得到你想要的['Área útil', '150m²']数组结果。
方法一:通用文本清理+分割法
这个方法适合类似格式的任意文本,不依赖固定内容:
// 你的原始文本 $rawText = " \n \t\t\t\t\tÁrea útil\n \t\t\t\t\n \t\t\t\t\t\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t150 m²\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n \t\t\t\t\n \t\t\t\t "; // 第一步:彻底移除所有换行(\n)和制表符(\t) $cleanedText = preg_replace('/[\n\t]/', '', $rawText); // 第二步:去掉首尾空格,再用2个及以上的空格作为分隔符拆分内容 $parts = preg_split('/\s{2,}/', trim($cleanedText)); // 第三步:单独处理第二个元素,去掉数字和单位之间的空格 $parts[1] = str_replace(' ', '', $parts[1]); // 输出结果 print_r($parts); // 最终输出:Array ( [0] => Área útil [1] => 150m² )
为什么这个方法有效?
- 先把所有干扰的换行和制表符清掉,剩下的只有空格和有效内容
- 用多个空格作为分割依据,因为原始文本里两个有效内容之间是大量空格分隔的
- 最后单独处理第二个元素的空格,保留第一个元素里的正常空格(比如
Área útil里的空格是需要的)
方法二:精准正则匹配法
如果你的文本格式是固定的(比如永远是Área útil和150 m²这类结构),可以用更直接的正则匹配:
$rawText = " \n \t\t\t\t\tÁrea útil\n \t\t\t\t\n \t\t\t\t\t\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t150 m²\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n \t\t\t\t\n \t\t\t\t "; // 直接匹配两个目标内容,/s修饰符让.能匹配换行符 preg_match('/(Área útil).*?(150\s*m²)/s', $rawText, $matches); // 整理成目标数组,处理第二个元素的空格 $result = [ $matches[1], str_replace(' ', '', $matches[2]) ]; print_r($result); // 输出同样符合要求
为什么你之前的正则没生效?
你之前尝试的(?!\n)(?!\t)[.]+这类正则逻辑有问题:负前瞻的用法不对,而且没有考虑到有效内容被大量空白分隔的情况,导致无法正确捕获到两个独立的有效文本块。
内容的提问来源于stack exchange,提问作者Adam Silva
相关产品推荐
相关产品推荐

