【发布时间】:2009-03-31 14:15:06
【问题描述】:
我在测试查找/替换功能时遇到了内存问题。
假设搜索主题是:
$subject = "我在 A+ 杂志上写了一篇文章。 它很长,充满了文字。 我想用链接替换本文中的每个 A+ 实例 到 A+ 专用页面。
";要找到的字符串:
$查找='A+'; $find = preg_quote($find,'/');替换函数回调:
函数replaceCallback($match) { if (is_array($match)) { return ''。 stripslashes($match[0]) 。 ''; } }和电话:
$result = preg_replace_callback($find, 'replaceCallback', $subject);现在,从数据库中提取了完整的搜索模式。到目前为止,它是:
$find = '/(?![^<]+>)\b(voice recognition|test project reference|test|synesthesia|Superflux 2007|Suhjung Hur|scripts|Salvino a. Salvaggio|Professional Lighting Design Magazine|PLDChina|Nicolas Schöffer|Naziha Mestaoui|Nabi Art Center|Markos Novak|Mapping|Manuel Abendroth|liquid architecture|LAb[au] laboratory for Architecture and Urbanism|l'Arca Edizioni|l' ARCA n° 176 _ December 2002|Jérôme Decock|imagineering|hypertext|hypermedia|Game of Life|galerie Roger Tator|eversion|El Lissitzky|Bernhard Tschumi|Alexandre Plennevaux|A+)\b/s';
然后在 7 个 mysql 表的 23 列中查找(如果找到则替换)这个 $find 模式。
使用建议的 preg_replace() 而不是 preg_replace_callback() 似乎已经解决了内存问题,但我遇到了新问题:preg_replace() 返回的主题缺少很多内容...
更新:
内容丢失是由于使用 preg_quote($find,'/'); 它现在可以工作了,除了... 'A+' 在这个过程之后变成了 'A '。
【问题讨论】:
-
您的实际搜索字符串是否更复杂?因为对于这个例子,你不需要 preg 任何东西 - str_replace() 会工作
-
是的。事实上,我正在为很多潜在的“标签”调用这个函数。这就是为什么我必须让它变得无故障_现在是失败的。
-
你的 php.ini 设置的内存限制是多少?
-
我尝试增加它 ini_set('memory_limit','50M');仍然有问题在我必须找到的标签列表中,我有法语特殊字符,例如“ê,é”。会不会是问题?
-
您能否更好地了解您的样本量?上面的精简示例实际上损害了我们现在为您提供帮助的能力。
标签: php regex preg-replace preg-replace-callback