我在数据库中有数据,行如:
Ticket #3532 Updated
Ticket #43252 Opened
Ticket #5462 Opened
Ticket #353 Updated
每行,在“更新或打开”一词后面有文字
我想在每一行上删除此文本,因此它只显示与上面完全相同的内容。
我尝试过使用:
strstr($result["notes"], 'Updated', true)
对于Updated
行,但返回
Ticket #34564
而不是更新一词
如何在PHP中或直接在SQL中执行此操作?
答案 0 :(得分:1)
假设您谈论MySql,您可以选择以下内容:
SELECT CONCAT(SUBSTRING_INDEX(myColumn, 'Updated', 1), 'Updated')
使用where子句来处理只有&'39; Updated'。
的行答案 1 :(得分:1)
您可以使用LOCATE()
函数直接在SQL中进行更新,以查找字符串中的Updated
或Opened
的第一个实例,以及LEFT()
字符串函数将其截断到该位置加上单词Updated
或Opened
的长度。使用字符串函数可以通过多种方式处理这个问题,但这是第一个想到的方法。
UPDATE tickets
SET notes = LEFT(notes, LOCATE('Opened', notes) + LENGTH('Opened'))
WHERE notes LIKE '%Opened%';
UPDATE tickets
SET notes = LEFT(notes, LOCATE('Updated', notes) + LENGTH('Updated'))
WHERE notes LIKE '%Updated%';
LEFT()
和LOCATE()
都记录在MySQL string functions。
答案 2 :(得分:1)
PHP解决方案
$str = 'Ticket #3532 Updated some text after';
$needle = 'Updated';
$substr = substr($str, 0, strpos($str, $needle) + strlen($needle));
答案 3 :(得分:0)
假设您正在使用MySQL并且您创建了适当的数据库备份,则以下查询应该完成此任务:
UPDATE `yourtable`
SET `yourcolumn` = CONCAT(
SUBSTRING_INDEX(
CONCAT(SUBSTRING_INDEX(`yourcolumn`, 'Updated', 1), 'Updated'),
'Opened', 1),
'Opened');
答案 4 :(得分:0)
<?php
$string = "Ticket #3532 Updated
Ticket #43252 Opened
Ticket #5462 Opened
Ticket #353 Updated";
echo preg_replace('/(Updated|Opened)/', '', $string);
// OR
$string2 = "Ticket #3532 Updated";
echo preg_replace('/(Updated|Opened)/', '', $string2);
?>
答案 5 :(得分:0)
就个人而言,我认为在MySQL中执行此操作有点麻烦,因为MySQL不支持REGEXP_REPLACE()
或REGEXP_SUBSTR()
。另一方面,PHP有一个很好的正则表达式引擎,应该能够轻松地获得匹配。匹配的好正则表达式可能是:
/^(Ticket #\d+ (?:Updated|Opened)).*$/
您的代码可能类似于:
$new_notes = preg_replace('/^(Ticket #\d+ (?:Updated|Opened).*$/', '$1', $result["notes"]);