如何删除字符串的一部分?[关闭]


152

如何删除字符串的一部分?

示例字符串: "REGISTER 11223344 here"

如何"11223344"从上面的示例字符串中删除?


您的问题不清楚/模棱两可。您使用的是术语remove,但您可能要用它来表示extract目标字符串可以存储在数据库中。
mickmackusa

@Makyen我很自信您已经破坏了这个问题,以使许多答案正确。想一想:OP为什么要保存REGISTER here在数据库中?
mickmackusa

2
@mickmackusa remove可以表示带走,即从字符串中取出11223344,我在这里看不到问题。最糟糕的情况是模棱两可,当然不会“破坏”
尼克

阅读预先破坏的版本。@Nick stackoverflow.com/posts/2192170/revisions真相将改变您的想法。我很高兴看到这个问题以“不清楚”结束。
mickmackusa

2
@mickmackusa我做到了...我看不到你的意思。如果您对编写方式有很大的疑问,为什么不自己修复它?
Nick

Answers:



119

您可以使用str_replace(),其定义为:

str_replace($search, $replace, $subject)

因此,您可以将代码编写为:

$subject = 'REGISTER 11223344 here' ;
$search = '11223344' ;
$trimmed = str_replace($search, '', $subject) ;
echo $trimmed ;

如果您需要通过正则表达式进行更好的匹配,则可以使用preg_replace()


2
如果需要正则表达式匹配,则还有preg_replace()us2.php.net/manual/en/function.preg-replace.php
Elijah Lynn

4
不知道为什么要发布这个答案,它是Dominic答案的较长副本,而是Roland答案的较短副本……
CPHPython

23

假设11223344不是常数

$string="REGISTER 11223344 here";
$s = explode(" ",$string);
unset($s[1]);
$s = implode(" ",$s);
print "$s\n";

8
str_replace(find, replace, string, count)
  • 找到必填项。指定要查找的值
  • 替换 必需。指定值来替换find中的值
  • 字符串 必需。指定要搜索字符串
  • count 可选。计算替换次数的变量

按照OP示例:

$Example_string = "REGISTER 11223344 here";
$Example_string_PART_REMOVED = str_replace('11223344', '', $Example_string);

// will leave you with "REGISTER  here"

// finally - clean up potential double spaces, beginning spaces or end spaces that may have resulted from removing the unwanted string
$Example_string_COMPLETED = trim(str_replace('  ', ' ', $Example_string_PART_REMOVED));
// trim() will remove any potential leading and trailing spaces - the additional 'str_replace()' will remove any potential double spaces

// will leave you with "REGISTER here"

1
您如何建议OP使用此伪代码?
mickmackusa

6

当您需要基于规则的匹配时,您需要使用正则表达式

$string = "REGISTER 11223344 here";
preg_match("/(\d+)/", $string, $match);
$number = $match[1];

这将与第一组数字匹配,因此,如果需要更具体的方法,请尝试:

$string = "REGISTER 11223344 here";
preg_match("/REGISTER (\d+) here/", $string, $match);
$number = $match[1];

preg_replace()会容易得多,不是吗?us2.php.net/manual/zh-CN/function.preg-replace.php
Elijah Lynn

1
@ElijahLynn replace需要您删除东西,否则将来的更改或噪音会破坏。通过_replace进行此操作,但_match将继续起作用。
TravisO 2013年

@TravisO好,是的,但是没有。这两个函数在实现上几乎是相同的函数,并且将来的更改影响它们中的任何一个的可能性都是相同的。将来只有在_match上进行更改的可能性相同,从而使此用法无效,并且_replace仍然可以正常工作。同样,如果可能的话,版本控制通常非常注意不要停止先前的功能。
CT。

您在这里不需要捕获组。实际上,使用捕获组会不必要地使$match阵列过大。删除括号,然后通过进入$match[0]
mickmackusa

5

substr()是一个内置的php函数,它返回字符串的一部分。函数substr()将一个字符串作为输入,即您希望修剪字符串的索引形式。可选参数是子字符串的长度。您可以在http://php.net/manual/en/function.substr.php上看到适当的文档和示例代码

注意:字符串的索引以0开头。


您如何建议OP应该使用您的一般提示来达到期望的结果?
mickmackusa

我发现这个答案含糊不清且价值不高。
mickmackusa

1

动态地,如果您想从一个或多个字符串的固定索引中删除一个或多个部分,请使用以下函数:

/**
 * Removes index/indexes from a string, using a delimiter.
 * 
 * @param string $string
 * @param int|int[] $index An index, or a list of indexes to be removed from string.
 * @param string $delimiter 
 * @return string
 * @todo Note: For PHP versions lower than 7.0, remove scalar type hints (i.e. the
 * types before each argument) and the return type.
 */
function removeFromString(string $string, $index, string $delimiter = " "): string
{
    $stringParts = explode($delimiter, $string);

    // Remove indexes from string parts
    if (is_array($index)) {
        foreach ($index as $i) {
            unset($stringParts[(int)($i)]);
        }
    } else {
        unset($stringParts[(int)($index)]);
    }

    // Join all parts together and return it
    return implode($delimiter, $stringParts);
}

为了您的目的:

remove_from_str("REGISTER 11223344 here", 1); // Output: REGISTER here

它的用途之一是执行类似命令的字符串,您知道它们的结构。


1
Ghostdog已经提出了爆炸内爆技术,但是我无法想象对于这样的基本操作来说,会经历如此漫长的挑战。
mickmackusa

0

以下代码段将在此处打印“ REGISTER”

$string = "REGISTER 11223344 here";

$result = preg_replace(
   array('/(\d+)/'),
   array(''),
   $string
);

print_r($result);

preg_replace()API的用法如下。

$result = preg_replace(
    array('/pattern1/', '/pattern2/'),
    array('replace1', 'replace2'),
    $input_string
);

preg_replace()在这种情况下,绝对没有理由将数组传递给它。使用捕获组也没有任何好处。
mickmackusa

我同意。添加数组只是为了方便。可以忽略。它不会有任何伤害。添加了捕获组以排除数字。这是按照绘制的问题进行的。并且可以根据个人进行进一步的修改和微调。
arango_86

我的意思是,您的代码段中包含不必要的包含内容,没有任何意义。
mickmackusa

-1

请执行下列操作

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER(.*)here/','',$string);

这将返回“ REGISTERhere”

要么

$string = 'REGISTER 11223344 here';

$content = preg_replace('/REGISTER (.*) here/','',$string);

这将返回“ REGISTER here”


4
它不会返回带有两个空格的“ REGISTER__here”(认为下划线为空格,注释不允许我再接两个空格)吗?由于“(。*)”之前和之后的空格。
TechNyquist 2014年

6
这个答案至少是100%错误。证明:3v4l.org/LDLEM 为什么此答案有15个UV?
mickmackusa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.