[英]php regular expression matches and replacement
再次。 我正在尝试通过数据库表并替换旧BBCode的所有实例(即: [i:fs8d979]
)并将其替换为简单的BBCode( [i]
)。 但是,我的结果非常混乱。
$root_path = './';
include($root_path.'includes/common.php');
$posts = array();
$sql = 'SELECT post_id, post_text FROM posts';
$db->query($sql);
while($row = $db->fetch_assoc())
{
$posts[]['id'] = $row['post_id'];
$posts[]['text'] = $row['post_text'];
}
foreach($posts as $post)
{
$regex = "/\[(\D)(\:[a-zA-Z0-9_]{1,})\]/";
if(preg_match($regex, $post['text'], $matches))
{
$string = preg_replace('/'.$matches[2].'/', '', $post['text']);
$sql = 'UPDATE posts SET post_text = "'.$string.'" WHERE post_id = '.$post['id'];
$db->query($sql);
echo $post['id'].'--Matched and replaced<br />';
}
else
{
echo $post['id'].'--No Match<br />';
}
}
echo 'done';
当我运行这个脚本时,我得到这样的输出:
1302--No Match
--No Match
1303--No Match
--No Match
17305--No Match
--Matched and replaced
5532--No Match
--No Match
17304--No Match
--No Match
1310--No Match
--No Match
似乎脚本试图做两次所有事情,我不知道为什么。 数据库字段也未更新。 为了调试的目的,我已经回应了所有的东西,所有的变量都设置好了,一切看起来都应该正常工作。 有什么建议么?
在代码中的点:
while($row = $db->fetch_assoc())
{
$posts[]['id'] = $row['post_id'];
$posts[]['text'] = $row['post_text'];
}
您正在数组中创建两个条目,一个具有id,后跟文本。
我想你想要:
while($row = $db->fetch_assoc())
{
$posts[] = array('id' => $row['post_id'], 'text' => $row['post_text']);
}
它可以解释为什么每一个都发生两次而且没有任何变化。
调试也显示错误的值:
echo $post['id'].'--Matched and replaced<br />';
而输出是
--Matched and replaced
,显示没有帖子ID。
第一:行
$posts[]['id'] = $row['post_id'];
$posts[]['text'] = $row['post_text'];
正在向$posts
数组添加两个元素。 这就是为什么你每个帖子得到两个输出。
第二:我不认为冒号:
是一个特殊的角色 - 它不需要逃脱。 所以看起来应该是这样的:
$regex = "/\[(\D)(:[a-zA-Z0-9_]+)\]/";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.