0

试图弄清楚这一点,如果除了正则表达式之外还有另一种方法,我愿意接受。

需要采取类似于以下的模式:

  • 一个在破折号之间有空格,另一个没有。
  • 有时可能有 3 个周期,有时可能有 4 个。
  • 在句点之间将始终是可能变化的数字,例如 1.111.1

    1. 1.1.1-50
    2. 1.1.1 - 50
    3. 1.1.1- 50
    4. 1.1.1 -50

以上应输出到:

  • 字符串 1:1.1。
  • 字符串2:1
  • 字符串 3:50

我不知道如何只选择最后一个句点和破折号之间的数字,选择破折号后面的数字,也忽略任何空格。

更新:完整且有效的代码

利用 hakre 和 Niels 提供的信息并创建了以下代码:

不确定我的代码是否经过优化,但这基本上是我需要完成的。

<form action="" method="post">
    <p>
        <strong>Records Range:</strong> <input type="text" name="records_range" size="30" maxlength="22" />
        <br />
        <strong>Internal ID:</strong> <input type="text" name="internal_id"  size="40" />
        <select name="id_options">
            <option value="default_internal_id">Default Internal ID</option>
            <option value="new_internal_id">New Internal ID</option>
        </select>
        <br />
        <input type="submit" value="Generate" />
    </p>
</form>

<?php 

    $id_options = NULL;                         
    if (isset($_POST['records_range'])) {   
        $id_options = $_POST['id_options'];
        $internal_id = strip_tags(trim(($_POST['internal_id'])));
        $records_range = strip_tags(trim($_POST['records_range']));
        preg_match('~^((?:\d+\.){2,3})(\d+)\s?-\s?(\d+)$~', $records_range, $record_segements);
        $range_prefix = $record_segements[1];
        $range_start = $record_segements[2];
        $range_end = $record_segements[3];
        echo "<p><strong>Record Data Generated For:</strong> ".$range_prefix.$range_start." - ".$range_end."</p>";
    }


    switch ($id_options){
        case 'default_internal_id':         
        echo "<textarea cols=\"65\" rows=\"10\">";

        // start output
        while($range_start <= $range_end){

            if($range_start < $range_end){
                echo "EUI-ZQ50-N-".$range_prefix.$range_start."\n";
            }

            else{
                echo "EUI-ZQ50-N-".$range_prefix.$range_start;
            }

            $range_start++;
        }
        echo "</textarea>";
        break;  

        case 'new_internal_id':         
        echo "<textarea cols=\"65\" rows=\"10\">";

        // start output
        while($range_start <= $range_end){

            if($range_start < $range_end){
                echo $internal_id." ".$records_prefix.$range_start"\n";
            }

            else{
                echo $internal_id." ".$records_prefix.$range_start;
            }

            $range_start++;
        }
        echo "</textarea>";
        break;
        default:
         echo "<h4>Example:</h4>";
         echo "<p><strong>Records Range</strong>: 1.22.333.444-500 = 1.22.333.444 <strong>THROUGH</strong> 500</p>";
    }

?>      
4

2 回答 2

4

创建三个与您的零件相匹配的组。

明确地说,在第一组中,digits+do​​t 需要重复两次:

  ~^((?:\d+\.){2,3})(\d+)\s?-\s?(\d+)$~
    `-------1------´`-2-´       `-3-´
            ^         ^           `--- end number
            |         | 
            |    middle number
            |       
first two/three incl. the dot

所有不匹配的东西,比如空格和破折号,都不会被捕获,这也可以被描述为“忽略”。

我希望这会有所帮助,并说明它是如何工作的。

交互式代码示例

<?php

$strings = [
    '1.1.1-50',
    '1.1.1 - 50',
    '1.1.1- 50',
    '1.1.1 -50',
    '1.1.1.1 -50',
];

foreach($strings as $subject)
{
    $pattern = '~^((?:\d+\.){2,3})(\d+)\s?-\s?(\d+)$~';
    $result  = preg_match($pattern, $subject, $matches);

    printf("%s -> %s\n", var_export($subject, 1), var_export($matches, 1));
}
于 2013-05-07T08:47:35.603 回答
3

从我的头上看,这应该适用于preg_match

/^([0-9\\.]+?)([0-9]+) ?\- ?([0-9]+)$/
于 2013-05-07T08:38:09.623 回答