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