MySQL - 令人困惑的RegEx变量问题

时间:2012-05-16 18:56:06

标签: mysql regex variables

我需要一些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应被视为通配符。竖条总是会分隔块。

4 个答案:

答案 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)

我问了一个不同但相似的问题,我认为解决方案同样适用于这个问题。

https://stackoverflow.com/a/10763476/1382779