Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何为数据库更改替换方括号中的文本?_Php_Mysql - Fatal编程技术网

Php 如何为数据库更改替换方括号中的文本?

Php 如何为数据库更改替换方括号中的文本?,php,mysql,Php,Mysql,我们正在将gallery软件从shareprints更改为foogallery,并且需要更改他们在博客帖子中使用的id。帖子内容现在有以下简称: [shareprints gallery_id=“14629”gallerytype=0等] 我们需要将其改为: [foodgallery_id=“14629”] 因此,我需要更改图库的名称,然后去掉方括号内的其余文本,而不更改方括号外的文本 有没有人可以用MySQL来实现这一点,或者有人对如何实现这一点有任何其他建议 谢谢最简单的方法就是编写脚本并更

我们正在将gallery软件从shareprints更改为foogallery,并且需要更改他们在博客帖子中使用的id。帖子内容现在有以下简称:

[shareprints gallery_id=“14629”gallerytype=0等]

我们需要将其改为:

[foodgallery_id=“14629”]

因此,我需要更改图库的名称,然后去掉方括号内的其余文本,而不更改方括号外的文本

有没有人可以用MySQL来实现这一点,或者有人对如何实现这一点有任何其他建议


谢谢

最简单的方法就是编写脚本并更新所有内容。除非你有数以百万计的条目,否则这将是更简单的方法。只需连接MYSQL,将所有行放入一个数组,然后在每次迭代中循环和更新

<?php
// Get all results in mysql sample data underneath
$input_lines = array(
    array(
        "id" => 1, 
        "line"=>'[shareprints gallery_id="14629" gallerytype = 0, etc]'
    )
);
// Loop each data 
foreach($input_lines as $l) {
    // Replace with new format
    preg_match_all('/\[[a-zA-Z]*\ ([^\ ]*)[^]]*/', $l['line'], $output_array);
    $input_lines = "[testname ". $output_array[1][0]."]"; // Change with new name here
    // var_dump($input_lines);
    // Update mysql with ID (l['id'] here)
}
?>

有一点取决于您的数据库服务器,它支持什么,但这里还有一个只使用数据库的方法:

> SELECT REGEXP_REPLACE('my text before [shareprints some_othertype gallery_id="14629" gallerytype = 0, etc] my text [shareprints some_othertype gallery_id="1" gallerytype = 0, etc] my text after',
                        '\\[shareprints [^\\]]*gallery_id="([0-9]+)"[^\\]]*\\]',
                        '\[foogallery gallery_id="\\1"]');
+--------------------------------------------------------------------------------------------------+
| REGEXP_REPLACE(...)                                                                              |
+--------------------------------------------------------------------------------------------------+
| my text before [foogallery gallery_id="14629"] my text [foogallery gallery_id="1"] my text after |
+--------------------------------------------------------------------------------------------------+
需要注意的是不要使regexp太贪婪,这就是为什么使用
[^\\]]*
而不是
*
)来捕获标记内(而不是标记外)不需要的任何内容。反向引用(括号)用于应传输的内容,然后在替换模式中使用相应的\N(N表示数字)

然后,当您对regexp感到满意时,就可以使用它了

UPDATE mytable
SET mycol=REGEXP_REPLACE(mycol,'myregexp','myreplacement')
WHERE <my condition in case I do not want to update all rows>
更新mytable
设置mycol=REGEXP\u REPLACE(mycol、'myregexp'、'myreplacement')
哪里

..或类似操作,使数据库保持忙碌一段时间;)

那个么,标签是存储在数据库中的一些字符串中的吗?那么,用regexp替换吗?小提示:如果gallery_id=不总是第二个单词,这将不起作用。谢谢你的回复,我确实有几千个条目需要更改!这会改变图库id还是保持不变?这也是我将testname更改为新库名的那一行吗$input_lines=“[testname”。$output_数组[1][0]”;是的,只需将testname更改为您想要的名称。ID将保持不变。几千条不会成为问题。您可能希望在开始时设置“set_time_limit(2000)”,这样您的PHP就不会超时。但是,如果你的mysql运行速度很慢,只有几千个条目,那么可能需要60-90秒(如果你不设置set_time_limit,apache会在30秒时超时)。我如何从我已经为input_lines数组准备的表中获取数据?这是来自mysqldump还是来自csv文件?很抱歉问了这些愚蠢的问题,我对php非常陌生,对mysql也不是很有经验@Rhydz97通过运行PHP并向数据库发出SELECT查询来从数据库中获取数据。我认为这本身就是一个问题:)。(在SO或Google上搜索“php数据库选择查询”或类似内容,您将获得可能需要的所有代码示例)感谢您的回复,这会在替换后保持id不变,还是会同时更改id?如果可能的话,我需要它来保持身份@Rhydz97是的,根据我上面不太清楚的例子:我的文本在[shareprints some_othertype gallery_id=“14629”gallerytype=0等]我的文本[shareprints some_othertype gallery_id=“1”gallerytype=0等]之后变成我的文本在[foogallery gallery gallery_id=“14629”]之后变成我的文本。我拿的是你想要的?是的,这就是我需要它做的!我在phpmyadmin上运行,我得到一个REGEXP_REPLACE错误,说它不存在,这个查询在phpmyadmin中不可用,还是我们需要更新到更新的版本?@Rhydz97好的,那么你可能运行的是MySQL的旧版本(你能告诉我是哪个版本吗?)。让我检查一下。@Rhydz97运气不好,REGEXP_REPLACE()需要MySQL>=8.0.12或MariaDB>=10.0.5。否则,您需要为数据库服务器安装额外的软件包以添加对它的支持。我认为这不是你的选择,phpmyadmin听起来像共享主机?