3

我需要一些关于 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) . "', '|%')

我需要修改 ^this 行以使用作为查询一部分的变量,同时保持当前效果(竖线等)到位​​。如果 RegEx 还考虑了柱,则可以删除 CONCAT() 函数。

这是一个带有连接的示例字符串,它可能出现在数据库中:

Hello, my name is $1.|Hello, I'm $1.|$1 is my name!

查询应该能够与字符串中的任何这些块匹配,然后在匹配时返回该行。变量$1应被视为通配符。竖线将始终分隔块。

4

4 回答 4

2

对于 MySQL,这篇文章是一个很好的指南,应该可以帮助你。正则表达式为“(\$)(\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
于 2012-05-16T19:08:26.760 回答
0

如果您不坚持使用 $1 和 $2 并且可以稍微更改它们,您可以看看这个:

http://php.net/manual/en/function.sprintf.php

例如

<?php
$num = 5;
$location = 'tree';

$format = 'There are %d monkeys in the %s';
printf($format, $num, $location);
?>
于 2012-05-16T19:08:44.923 回答
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);
}

(我没有测试过,所以那里可能有错别字,但应该足以给出一般的想法。)

一个缺点是,如果您的字符串中有十多个要替换的参数,它将失败 - 第一次运行将替换 $10 的前两个字符,因为它正在寻找 $1。

于 2012-05-16T19:12:35.433 回答
0

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

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

于 2012-07-11T19:11:49.743 回答