正则表达式删除尾随字符

时间:2014-12-20 15:43:30

标签: php regex

我正在寻找Php中的正则表达式,它可以像这样转换传入的字符串:

abaisser_negation_pronominal_question     => abaisser_n_p_q
abaisser_pronominal_question              => abaisser_p_q
abaisser_negation_question                => abaisser_n_q
abaisser_negation_pronominal              => abaisser_n_p
abaisser_negation_voix_passive_pronominal => abaisser_n_v_p_p
abaisser                                  => abaisser

Php代码接近于:

$line=preg_replace("/<h3>/im", "", $line);

你会怎么做?

4 个答案:

答案 0 :(得分:2)

您可以使用:

$input = preg_replace('/(_[A-Za-z])[^_\n]*/', '$1', $input);

RegEx Demo

<强>解释

  • 此正则表达式搜索(_[A-Za-z])[^_\n]*,表示下划线后跟单个字母,然后在换行符或下划线之前匹配
  • 它在后引用(_[A-Za-z])
  • 中捕获第一部分$1
  • 替换为$1,在替换字符串中留下下划线和第一个字母

答案 1 :(得分:0)

$line = preg_replace("/_([a-z])([a-z]*)/i", "_$1", $line);

答案 2 :(得分:0)

您可以使用正则表达式

$input = preg_replace('/_(.)[^\n_]+/', '_$1', $input);

DEMO

它的作用是在_之后捕获角色并匹配,直到遇到\n_并替换为_$1,这意味着_加上捕获的角色。

答案 3 :(得分:0)

您可以使用\K或正面的背后隐藏。

$input = preg_replace('~_.\K[^_\n]*~', '', $input);

上述正则表达式中的模式_.将匹配_以及下划线后面的字符。 \K会丢弃先前匹配的字符_加上以下字符。它不会考虑这两个字符。现在[^_\n]*匹配任何字符,但不匹配_\n换行符的零次或多次。因此,以下划线开头的字符后面的字符将与下一个_\n字符匹配。删除这些字符将为您提供所需的输出。

DEMO

$input = preg_replace('~(?<=_.)[^_\n]*~', '', $input);

它只关注__后面的字符,并匹配下一个下划线或换行符的所有字符。

DEMO