PHP中如何搜索提取子串及拆分含地址姓名的字符串入库?
嘿,这两个PHP字符串处理的问题我太熟了,给你一步步讲清楚!
1. 如何在PHP中从字符串里搜索并提取指定子串?
提取子串的方法有好几种,得根据你的具体需求来选:
方法一:用
strpos()+substr()组合
这是最基础的组合,先找到子串的位置,再截取。适合你知道要提取的子串内容,或者要截取某个位置前后内容的情况。$originalStr = "今天的天气真不错,适合出门散步"; $target = "天气"; // 先找子串的起始位置 $pos = strpos($originalStr, $target); // 一定要用!==false判断,因为strpos可能返回0(子串在开头) if ($pos !== false) { // 从$pos位置开始,截取长度为strlen($target)的内容 $extracted = substr($originalStr, $pos, strlen($target)); echo $extracted; // 输出 "天气" }方法二:用
preg_match()正则匹配
如果要提取的内容有固定模式(比如邮箱、手机号、URL),正则绝对是最优解。$str = "我的手机号是13812345678,记得联系我"; // 匹配11位手机号的正则 if (preg_match('/1[3-9]\d{9}/', $str, $matches)) { echo $matches[0]; // 输出 "13812345678" }正则的好处是能处理复杂的格式,哪怕子串周围的内容有变化也能精准提取。
方法三:用
strstr()直接截取
如果你想提取从某个子串开始到字符串结尾的内容,或者子串之前的内容,strstr()很方便:$str = "咖啡, 奶茶, 果汁, 可乐"; // 提取从"奶茶"开始到结尾的内容 $result1 = strstr($str, "奶茶"); echo $result1; // 输出 ", 奶茶, 果汁, 可乐" // 第三个参数传true,提取"奶茶"之前的内容 $result2 = strstr($str, "奶茶", true); echo $result2; // 输出 "咖啡"
2. 从混合信息字符串中提取地址和姓名
针对你给的示例字符串$string = 'Address : 123 Street Name : John';,推荐两种靠谱的方法:
方法一:正则捕获组(最灵活)
用正则匹配Address :和Name :之间的内容,以及Name :之后的内容,用捕获组直接拿到对应的值:$string = 'Address : 123 Street Name : John'; // 正则里的(.*?)是非贪婪匹配,避免把Name的内容也包含进去 if (preg_match('/Address : (.*?) Name : (.*)/', $string, $matches)) { $address = trim($matches[1]); // 去掉前后可能的空格 $name = trim($matches[2]); echo "地址:{$address}\n姓名:{$name}"; // 输出: // 地址:123 Street // 姓名:John }这种方法哪怕字符串里的空格有细微变化(比如多了几个空格),正则也能匹配到,容错性强。
方法二:字符串分割(适合格式完全固定的情况)
如果你的字符串格式永远是Address : [地址] Name : [姓名],用explode()分割也很简单:$string = 'Address : 123 Street Name : John'; // 先按"Name : "分割,得到地址部分和姓名 $splitByName = explode('Name : ', $string); $name = trim($splitByName[1]); // 再把地址部分按"Address : "分割,拿到地址 $splitByAddress = explode('Address : ', $splitByName[0]); $address = trim($splitByAddress[1]); echo "地址:{$address}\n姓名:{$name}";这个方法代码直观,但如果字符串格式变了(比如顺序调换、关键词拼写变化)就会失效,所以适合格式绝对固定的场景。
内容的提问来源于stack exchange,提问作者Siyan
相关产品推荐
相关产品推荐

