Php 允许数字和字符之间使用连字符符号但删除字符之间的连字符符号的正则表达式

Php 允许数字和字符之间使用连字符符号但删除字符之间的连字符符号的正则表达式,php,regex,Php,Regex,我正在尝试编写一个正则表达式,允许数字和字符之间使用连字符(-),但删除字符之间的连字符,并用PHP字符串中的空格替换它。我是正则表达式的初学者,不知道如何编写正则表达式,有人能帮我吗 这里我需要的是一个类似PHP的字符串 $string ="Al-Abbas - Manama - 100" or $string ="100 - Al-Abbas - Manama" 应用正则表达式后我需要的输出必须是 Al Abbas Manama - 100 100 - Al Abbas Manama

我正在尝试编写一个正则表达式,允许数字和字符之间使用连字符(-),但删除字符之间的连字符,并用PHP字符串中的空格替换它。我是正则表达式的初学者,不知道如何编写正则表达式,有人能帮我吗

这里我需要的是一个类似PHP的字符串

$string ="Al-Abbas - Manama - 100" or
$string ="100 - Al-Abbas - Manama"
应用正则表达式后我需要的输出必须是

Al Abbas Manama - 100
100 - Al Abbas Manama 

任何其他方法都可以执行此操作,请帮助

您可以使用此正则表达式:

$string ="Al-Abbas - Manama - 100"

$repl = preg_replace('/\d\h*-\h*(*SKIP)(*F)|-(?!\h*\d)/', ' ', $string);
  • \d\h*-\h*(*SKIP)(*F)
    如果连字符出现在数字后面,则匹配将失败
  • (?!\h*\d)
    如果连字符旁边有数字,则断言将失败
您可以使用纯PHP:

$string1 ="Al-Abbas - Manama - 100";
$string2 ="100 - Al-Abbas - Manama";

function convertString($string) {
    $strArr = explode("-", $string);
    $new = '';
    foreach ($strArr AS $key => $val) {
        $val = trim($val);
        if (is_numeric($val)) {
            if ($key === 0) $new .= $val . " - ";
            else            $new .= " - " . $val;
        } else {
            $new .= " " . $val;
        }
    }
    return $new;
}

echo convertString($string1); //output: Al Abbas Manama - 100
echo convertString($string2); //output: 100 - Al Abbas Manama

谢谢,但我也想这样做,当号码排在第一位时299-bandar Al-SeefDude我不需要什么帮助,请将此表达式更改为js。js不支持相同的PCRE功能,请创建一个新问题,以便获得更好的答案。如果像号码排在第一位一样进行订单更改,是否有效?