3

正規表現について助けが必要です。概念は単純ですが、実際の解決策は、私が理解する方法をはるかに超えています。誰かが私が望む効果を達成する方法を説明できれば(そしてサンプルコードで説明を提供してください)、それは大歓迎です!


基本的に、次の文字列を格納するデータベース テーブルを想像してください。

'My name is $1. I wonder who $2 is.'

まず、ドル記号と数値の形式が固定されていることに注意してください。これはこの例だけではありません。これらのワイルドカードが実際に格納される方法です。上記の文字列を返すことができるようにするには、次のような入力が必要です。

'My name is John. I wonder who Sarah is.'

この形式のワイルドカードを使用して検索し、該当する行を返すクエリを作成するにはどうすればよいですか? 正規表現が最善の方法だと思います。理論的には、任意の数のワイルドカードを使用できることに注意してください。

現在、これはデータベースからコンテンツをドラッグする既存のクエリの一部です。連結などがあるのは、1 つのデータベース セルに複数の文字列が縦線で連結されているためです。

AND CONCAT('|', content, '|')
    LIKE CONCAT('%|', '" . mysql_real_escape_string($in) . "', '|%')

^この行を変更して、現在の効果 (垂直バーなど) を維持しながら、クエリの一部である変数を操作する必要があります。正規表現がバーも考慮に入れる場合、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

私は別の、しかし類似した質問をしました、そして私は解決策がこの質問にも同様に当てはまると思います。

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

于 2012-07-11T19:11:49.743 に答える
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);
}

(私はそれをテストしていないので、そこにタイプミスがあるかもしれませんが、一般的なアイデアを与えるには十分なはずです.)

1 つの欠点は、置換する文字列に 10 個を超えるパラメーターがある場合に失敗することです。最初のランスルーでは、$1 を探しているため、$10 の最初の 2 文字が置き換えられます。

于 2012-05-16T19:12:35.433 に答える