2

データベースからの大量のテキストに含まれるhref属性内で、アンダースコアをダッシュ​​に置き換えようとしています。

既存のテキスト:

Hello, my name is <a href="http://example.com/joe_smith">joe smith</a> and I  
eat pizza with my friend <a href="http://example.com/john_doe">john doe</a>.

出力:

Hello, my name is <a href="http://example.com/joe-smith">joe smith</a> and I 
eat pizza with my friend <a href="http://example.com/john-doe">john doe</a>.

現在mysqlデータベースにあるので、sqlステートメントを使用してアクションを実行できればより高速になると思いますが、それが不可能な場合は、php正規表現を使用して実行したいと思います。

何らかの理由で通常のテキストにある下線を置き換えたくありません。href内にあるものだけ。

4

3 に答える 3

3

MySQLの正規表現は検索専用です。交換は一切サポートしていません。それらを使用して、修正が必要なレコードを見つけることができますが、実際にレコードを変更する場合にのみ、mysql内の基本的な文字列操作に制限されます。

一致したレコードをPHPにプルし、そこで変更を行う方がよいでしょう。もちろん、これはhtmlでの正規表現の使用をもたらします...それをしないでください。実際の操作には、代わりにPHPのDOMを使用してください。

于 2012-04-19T15:51:12.350 に答える
1

あなたは1つの更新SQLクエリでそれを行うことができます。テストテーブルを用意し、クエリを更新してデモンストレーションします。基本的に自分のテーブルで使用するには、テーブル名をTestTableからテーブル名に変更し、「Field」の名前を更新するフィールド名に変更するだけです。

1つのフィールドに複数のhrefリンクがある場合。クエリを複数回実行する必要があります。最初のクエリで、テーブル内の最大リンクオカレンスを見つけることができます。更新クエリを複数回実行するより。使用した一時データをクリアするために1つ多くのクエリを更新するよりもoccurence_countのカウントでクエリを更新すると、

-テーブルで最大のリンクオカレンスを見つけます

SELECT max(cast((LENGTH(Field) - LENGTH(REPLACE(Field, '<a href', ''))) / 7 as unsigned)) AS occurrence_count 
FROM TestTable;

--テーブルoccurrence_count回を更新して、すべてのhrefリンクを置き換えます。

update TestTable 
set Field = replace
                (
                   @b:=replace
                   (
                     @a:=replace(Field
                      , substring(Field, Instr(Field, "<a href='"), Instr(Field, "</a>")-Instr(Field, "<a href='")+4)
                      , replace(substring(Field, Instr(Field, "<a href='"), Instr(Field, "</a>")-Instr(Field, "<a href='")+4), "_", "-")
                      )
                     , substring(@a, Instr(@a, "<a href='"), Instr(@a, "</a>")-Instr(@a, "<a href='")+4)
                     , replace(substring(@a, Instr(@a, "<a href='"), Instr(@a, "</a>")-Instr(@a, "<a href='")+4), "<a href=", "<*a href=")
                   )
                 , substring(@b, Instr(@b, "<*a href='"), Instr(@b, "</a>")-Instr(@b, "<*a href='")+4)
                 , replace(substring(@b, Instr(@b, "<*a href='"), Instr(@b, "</a>")-Instr(@b, "<*a href='")+4), "</a>", "</*a>")
                )
;

--すべての更新が終了したら、これを1回実行して、hrefリンクから星をクリアします。

update TestTable set Field = replace(replace(Field, "<*a href", "<a href"), "</*a>", "</a>")

-テーブルを確認してください

select * from TestTable;

テストテーブル

CREATE TABLE `testtable` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `Field` VARCHAR(255) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT

テストデータ

Insert into TestTable (Field) values ("Hello, my name is <a href='http://example.com/joe_smith'>joe smith</a> and I eat pizza with my friend <a href='http://example.com/john_doe'>john doe</a>");
Insert into TestTable (Field) values ("Hello, my name is <a href='http://example.com/joe_smith'>joe smith</a> and I eat pizza with my friend <a href='http://example.com/john_doe'>john doe</a> my friend <a href='http://example.com/john_doe'>jane doe</a>");
于 2012-04-19T20:48:45.273 に答える
0
(<a href=".+?)_(.+?">)

交換あり

$1-$2
于 2012-04-19T20:28:30.190 に答える