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 更改为您的表格名称,并将“字段”的名称更改为您要更新的字段名称。

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

-- 查找表中的最大链接出现次数

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

-- 更新你的表出现次数以替换所有的 a 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;

测试台

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 回答