Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:127646 X-Original-To: internals@lists.php.net Delivered-To: internals@lists.php.net Received: from php-smtp4.php.net (php-smtp4.php.net [45.112.84.5]) by lists.php.net (Postfix) with ESMTPS id 47F6F1A00BC for ; Wed, 11 Jun 2025 09:58:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1749635816; bh=gpU1nSKqGAt+mSrp2IQ6QDRouwzDlV3YBjmmq0g8z3g=; h=From:Subject:Date:References:To:In-Reply-To:From; b=F8Sal3K+4h4qL1AtVaBwamoBjxQGO7DIKkcMMSm6PQL88wSI5WzqzlemLy5ejIzYg iA3J5qiZ9oKo1SFTdigDwxmK+5244k9ZENx+SVnSot52uSHVjV/KrS8trWAc/EhVAj EM7434WiW1REQkRT1dDAHhfYfi/vQJIWXBFcYAH1h6PYRxY5icMLCk7nIUvQnwCFxm 6o0CD3StrRpKPq6eSyVDK/m+Y62ct5nlB/KlXMMXRmJsZ2OMb4Z4ne87YvGrXroBrm jmzmPfAA+JOMizf5bQrYddTX89KzQPQccQOZ2w7TijX7bxir2iHrXiouBabAmTZWbn xI+C93o1WyjUA== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 763B218002F for ; Wed, 11 Jun 2025 09:56:55 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=BAYES_05,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,DMARC_PASS,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=4.0.1 X-Spam-Virus: Error (Cannot connect to unix socket '/var/run/clamav/clamd.ctl': connect: Connection refused) X-Envelope-From: Received: from mail.gna.ch (mail.gna.ch [212.45.196.109]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Wed, 11 Jun 2025 09:56:55 +0000 (UTC) Received: from smtpclient.apple (unknown [194.169.219.181]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by darkcity.gna.ch (Postfix) with ESMTPSA id 9866E3A0CF5 for ; Wed, 11 Jun 2025 11:58:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=cschneid.com; s=default; t=1749635934; bh=gpU1nSKqGAt+mSrp2IQ6QDRouwzDlV3YBjmmq0g8z3g=; h=From:Subject:Date:References:To:In-Reply-To; b=XQyGEtqubqHklFSqNr/3IMKTXZM/VU1BS0RcvyK6k5uzZJicKbBNkQoAl3JHwiNqN FA63DC9metrA5zKijrj7SA7hrKX47ls/GKOOUKIUTJHoMhJWJC1b+zsFzEqY52IdF/ KUzGpXWn5C9gw6P3fXTQsNmnOtxpkOq4TE4aAKfs= Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Precedence: bulk list-help: list-post: List-Id: internals.lists.php.net x-ms-reactions: disallow Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.600.51.1.1\)) Subject: Re: [PHP-DEV] Can we make str_(starts|ends)_with variadic? Date: Wed, 11 Jun 2025 11:58:54 +0200 References: To: PHP Internals List In-Reply-To: Message-ID: X-Mailer: Apple Mail (2.3826.600.51.1.1) From: cschneid@cschneid.com (Christian Schneider) Am 10.06.2025 um 21:46 schrieb Hans Henrik Bergan : > Can we make str_(starts|ends)_with variadic? > ``` > if (str_starts_with($url, "http://", "https://")) { > // url > } > if (str_ends_with($filename, ".pdf", ".doc", ".docx")) { > // document > } > if(str_ends_with($str, ...$validExtensions){ > // valid extension > } > ``` Hmm, being old-fashioned I would probably do this with a regex: str_starts_with($url, "http://", "https://") =3D> = preg_match('#^https?://#', $url) str_ends_with($filename, ".pdf", ".doc", ".docx") =3D> = preg_match('#\.(pdf|doc|docx)$#', $filename) str_ends_with($str, ...$validExtensions) =3D> = preg_match('#\.(' . implode('|', array_map(fn($v) =3D> preg_quote($v, = '#'), $ validExtensions)) . ')$#', $str) And even though the variadic versions could easily be implemented in = user-land I see your point about your version being clearer and less = error-prone, even though my old brain is worried about a hidden loop = (but that's an implementation detail and can be avoided if one really = wants to). Another way of thinking about it would be array_any($validExtensions, fn($ext) =3D> str_ends_with($str, $ext)) which is quite concise as well and avoids reimplementing iteration for = individual functions separately. Which leaves me +-0 on this, - Chris