【问题标题】:PHP: Check if my string only contains numbers and "X" characterPHP:检查我的字符串是否只包含数字和“X”字符
【发布时间】:2017-06-01 16:01:13
【问题描述】:

我检索我的尺寸产品的下一个值:30X50 或 20x20

如果这个值包含字符 x 或 X 并且只有数字,我想添加“cm”度量。

@if($myvalue contains only the character x and numbers)
 {{ $myvalue }} cm // like 20x20cm
@endif

我需要一个正则表达式。我试试这个:

@if (preg_match('/^\d*(x|X){1}\d*$/',$item->name)) cm.@endif

但不起作用

【问题讨论】:

  • 如何获取正则表达式是您的问题?好吧,通过写它。为此,您必须了解正则表达式。你开始这样做了吗?
  • 请注意,SO 不是免费的编码服务。我们不是来为你做你的工作。我们在这里帮助您解决特定问题您遇到在您自己的代码中。所以从你自己开始吧,如果你遇到严重的问题,那么是时候来到这里,发布你的代码并指出你遇到的问题。
  • 提示:regex101.comphp.net/manual/en/function.preg-match.php 这不需要复杂的正则表达式。
  • @arkascha 我编辑主帖

标签: php laravel laravel-5


【解决方案1】:

在这种微不足道的情况下不要使用正则表达式。例如,您可以编写自己的域解析函数。

/**
 * Parse dimension
 *
 * @return array [dimX, dimY] or empty array when invalid input
 */
function parse(string $meta): array {

    $parseTree = explode('x', strtolower($meta));

    if (2 != \count($parseTree)
            || !ctype_digit($parseTree[0])
                || !ctype_digit($parseTree[1])) {
        return [];
    }

    return $parseTree;

}


/**
 * Test {@see parse}
 * @throws \LogicException When test failed
 */
function testParse() {

    $dataProvider = [
        ['20x50', [20, 50]],
        ['20X50', [20, 50]],
        ['20z50', []],
        ['a20x50', []],
        ['20xa50', []],
    ];


    foreach($dataProvider as $serie) {
        if (parse($serie[0]) != $serie[1]) {
            throw new \LogicException('Test failed');
        }
    }

}


testParse();

【讨论】:

  • 在处理域数据时不太灵活,可维护。
  • 只要您只使用原始类型,正则表达式就是要走的路。使用自定义代码,您的灵活性不如使用正则表达式。自定义代码也更慢,并且更依赖资源。只有当您无法使用正则表达式(对象数据)时,才可以使用自定义代码。
  • 在解析和验证域数据和处理输入之间存在差异。例如,我可以有许多验证装饰器功能等。
猜你喜欢
  • 2017-07-04
  • 2011-07-11
  • 2010-12-27
  • 2017-11-02
  • 2012-06-27
  • 2012-06-23
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多