我有这样的字符串:
The product title is [title] and the price is [price] and this product link is [link]
我有一个叫做$get_product
的变量,它包含了关联数组。
现在,我想用$get_product[xxx]
变量键替换字符串中的**[xxx]**。
$pattern = '/\[(.*?)\]/';
preg_match_all($pattern, $optimization_prompt, $matches);
if( $matches ) {
foreach( $matches as $key => $match ) {
for( $i = 0; $i < count($match); $i++ ) {
if( preg_match_all($pattern, $match[$i], $matches) ) {
// with bracket
$remove_bracket = trim( $match[$i], '[]');
$optimization_prompt = str_replace( $match[$i], isset( $get_product[$remove_bracket] ) ? $get_product[$remove_bracket] : '', $optimization_prompt);
} else {
// Without bracket
$remove_bracket = trim( $match[$i], '[]');
$optimization_prompt = str_replace( $match[$i], '', $optimization_prompt);
}
}
}
}
它返回我:
<pre>The product is Infaillible Full Wear327 Cashm and the is 10.49 and this product is https://www.farmaeurope.eu/infaillible-full-wear327-cashm.html</pre>
结果是好的,但它删除了名为标题,价格链接的实际文本
4条答案
按热度按时间szqfcxe21#
这不是
preg_match_all
的工作,而是preg_replace_callback
的工作(这是一个替换任务,是或不是?)demo
该模式使用捕获组(捕获组1)提取方括号中的内容。
preg_replace_callback
的第二个参数是回调函数,用于测试捕获的内容$m[1]
是否作为数组$get_product
中的键存在,并返回相应的值或完全匹配的$m[0]
。完全不使用regex的另一种方法(因为您要查找文字字符串):
demo
y53ybaqx2#
我不知道你想做什么,但是看起来太复杂了。下面是一个简单的解决方案:
drkbr07n3#
如果查看第一个
preg_match_all()
的结果,您会发现$matches
数组中包含了所需的所有内容$matches
阵列所以你可以简化代码
结果是
gdx19jrr4#
添加一些调试行应该会有所帮助:
输出:
这里:
WITHOUT Replace -title-: :
表示-
之间的文本替换为:
之间的文本,从而有效地删除了文本title
。