我需要一些RegEx的帮助。这个概念很简单,但实际的解决方案远远超出我所知道的任何解决方案。如果有人能解释我如何达到我想要的效果(并提供任何示例代码的解释),我将不胜感激!
基本上,想象一下存储以下字符串的数据库表:
'My name is $1. I wonder who $2 is.'
首先,请记住美元符号数字格式是一成不变的。这不仅仅是针对这个例子 - 这就是这些通配符实际存储的方式。我希望像下面这样的输入能够返回上面的字符串。
'My name is John. I wonder who Sarah is.'
如何创建以此格式使用通配符搜索的查询,然后返回适用的行?我想正则表达式是最好的方式。请记住,从理论上讲,任何数量的通配符都应该是可以接受的。
现在,这是我现有查询的一部分,它将内容拖出数据库。串联等等,因为在单个数据库单元中,有多个字符串由垂直条连接。
AND CONCAT('|', content, '|')
LIKE CONCAT('%|', '" . mysql_real_escape_string($in) . "', '|%')
我需要修改^这一行来处理作为查询一部分的变量,同时保持当前效果(垂直条等)。如果RegEx也考虑了条形,那么可以删除CONCAT()函数。
这是一个带有串联的示例字符串,因为它可能出现在数据库中:
Hello, my name is $1.|Hello, I'm $1.|$1 is my name!
查询应该能够与字符串中的任何块匹配,然后如果匹配则返回该行。变量$1
应被视为通配符。竖条总是会分隔块。
答案 0 :(得分:2)
对于MySQL,this article是一个很好的指南,可以帮助你。 Regexp将是“(\ $)(\ d +)”。这是我从文章中删除的查询:
SELECT * FROM posts WHERE content REGEXP '(\\$)(\\d+)';
检索数据后,请使用此便捷功能:
function ParseData($query,$data) {
$matches=array();
while(preg_match("/(\\$)(\\d+)/",$query,$matches)) {
if (array_key_exists(substr($matches[0],1),$data))
$query=str_replace($matches[0],"'".mysql_real_escape_string($data[substr($matches[0],1)])."'",$query);
else
$query=str_replace($matches[0],"''",$query);
}
return $query;
}
用法:
$query="$1 went to $2's house";
$data=array(
'1' => 'Bob',
'2' => 'Joe'
);
echo ParseData($query,$data); //Returns "Bob went to Joe's house
答案 1 :(得分:0)
如果你对使用1美元和2美元不太感兴趣并且可以稍微改变它们,你可以看一下:
http://php.net/manual/en/function.sprintf.php
E.G。
<?php
$num = 5;
$location = 'tree';
$format = 'There are %d monkeys in the %s';
printf($format, $num, $location);
?>
答案 2 :(得分:0)
如果要在数据库中查找条目,则可以使用LIKE语句:
SELECT statement FROM myTable WHERE statement LIKE '%$1%'
将查找包含$ 1的所有语句。我假设要替换的第一个数字总是$ 1 - 在这种情况下,通配符的总数是任意的,因为我们只是在寻找第一个。
PHP更换有点棘手。你可能会做类似的事情:
$count = 1;
while (strpos($statement, "$" . $count)) {
$statement = str_replace("$" . $count, $array[$count], $statement);
}
(我没有测试过,因此可能会有拼写错误,但它应该足以提出一般性的想法。)
一个缺点是,如果要替换的字符串中有十个以上的参数,它将失败 - 第一个runthrough将替换$ 10的前两个字符,因为它正在寻找$ 1.
答案 3 :(得分:0)
我问了一个不同但相似的问题,我认为解决方案同样适用于这个问题。