尝试在href标记内用短划线替换下划线_

时间:2012-04-19 15:48:25

标签: php mysql regex preg-replace

我正在尝试使用来自数据库的大量文本的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内的那些。

3 个答案:

答案 0 :(得分:3)

MySQL的正则表达式仅供搜索。他们根本不支持替换。您可以使用它们来查找需要修复的记录,但是您只能在mysql中使用基本的字符串操作来实际更改记录。

最好将匹配的记录拉入PHP并在那里进行更改。这当然会带来html上正则表达式的使用......不要这样做。使用PHP的DOM代替实际的操作。

答案 1 :(得分:1)

你可以用1更新sql查询来做到这一点。我为你准备了一个测试表,并更新了查询来演示。 基本上要在自己的表上使用,只需将表名从TestTable更改为表的名称,并更改&#34; Field&#34;的名称。到您要更新的字段名称。

如果您在一个字段中有多个href链接。您需要多次执行查询。 您可以使用第一个查询在表中找到最大链接出现次数。比多次执行更新查询。当你在occurence_count计数更新你的查询而不是更新1更多查询我给你清除我使用的一些临时数据。

- 查找表格中的最大链接数

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

- 更新您的表times_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>")
                )
;

- 当您的所有更新完成以清除href链接中的星星时运行此次。

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

- 查看表格

select * from TestTable;

TEST TABLE

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>");

答案 2 :(得分:0)

(<a href=".+?)_(.+?">)

更换

$1-$2