# PHP preg regular-expression engine

Regex Tools runs patterns in the actual PHP 8.5.8 `preg` implementation,
backed by PCRE2 10.44. The browser runtime is the Asyncify build from
`@php-wasm/web-8-5@3.1.46`; its host API is
`@php-wasm/universal@3.1.46`.

The fixed `bridge.php` file is installed in PHP's private virtual filesystem.
Pattern, flags, subject, limits, and replacement are written separately as
JSON. No user-controlled value is evaluated or interpolated into PHP source.
The bridge selects a safe preg delimiter and passes only validated modifiers.

PHP reports `PREG_OFFSET_CAPTURE` positions as UTF-8 bytes. The adapter retains
those native ranges and normalizes code-point boundaries to browser UTF-16.
Unpaired UTF-16 surrogates are rejected before entering the runtime. Without
the `u` modifier, a byte-oriented match that splits a UTF-8 character is
reported as unsupported because it cannot be represented losslessly in a
browser string.

Replacement never asks `preg_replace` to materialize an unbounded result.
Native `preg_match` records remain authoritative; a fixed bridge parser mirrors
PHP 8.5.8's `preg_get_backref()` rules and streams literal/capture bytes into
the requested cap. The identity self-test compares that fixed implementation
with `preg_replace` only as a parity oracle. The bridge returns bounded bytes as
base64 so JSON escaping cannot unexpectedly multiply the transport envelope.
A timeout, cancellation, supersession, or crash terminates the dedicated
worker and its entire PHP WebAssembly heap.

## Exact source and native-component boundary

The shipped `php.wasm` is SHA-256
`ed97ea5422dbf23e0687c98203cc8c6d7f2772a3d71b03d4991d2fdd93a048f0`
from `@php-wasm/web-8-5@3.1.46`. That npm package records WordPress Playground
commit `581c7c172428159eb4e6c5309054a568cd39a97a` (`v3.1.46`). The PHP source
base is tag `php-8.5.8`, tag object
`8a3b5a5124006c11a8fbfce838ec7dd53615cc77`, peeled commit
`26b97507444c4fbda072f57dda1820f7b7d5e467`; the final main module uses
Emscripten 4.0.19 at
`08e2de1031913e4ba7963b1c56f35f036a7d4d56`.

`native-components.json` is the machine-readable inventory for this exact
binary. It records 32 linked source/component surfaces:

- PHP and its bundled PCRE2, libbcmath, timelib/tzdata, libmagic, Lexbor,
  libmbfl, uriparser and libavifinfo code;
- zlib, libzip, libxml2, SQLite, libgd, libjpeg-turbo, libpng,
  libwebp/libsharpyuv, libavif, libaom/libyuv, OpenSSL, curl, libiconv and
  Oniguruma;
- the WordPress Playground wrapper plus the Emscripten runtime, musl,
  compiler-rt, libc++, libc++abi and dlmalloc surfaces.

Every versioned external archive or Git route, available archive hash/commit,
runtime evidence, licence/notice route and patent notice is recorded there.
The Oniguruma recipe is the one upstream exception: it cloned its default
branch without a revision. The inventory therefore does not falsely identify
the release tag as the build commit. It pins the exact committed `libonig.a`
blob and SHA-256, its Emscripten 4.0.5 compiler provenance, the installed header
blob, runtime version 6.9.10, audited release source and the bounded upstream
source interval `005482a…3eb317d` before the header changed.

The same inventory explicitly records why GMP, libsodium, tidy and ICU/intl
names found by a raw string scan are not linked extensions: those names are
Zend optimizer metadata or an unshipped side module, and the runtime verifier
asserts their absence. It also records that FreeType is disabled in the exact
libgd recipe even though the recipe's synthetic `gdlib-config --features`
string makes `gd_info()` report it, that ImageMagick/imagick is disabled, and
that libavif's local AOM 3.12.1—not the adjacent standalone AOM 3.13.1
recipe—is linked. Positive extension/library versions, negative detections and
AOM/libjpeg binary markers are executable pack-verification gates.

## Redistribution

The pack explicitly elects PHP License version 4 (`BSD-3-Clause`) for the PHP
8.5.8 codebase through the earlier licence's later-version option.
The pack also carries the exact Zend Engine licence, php-src's official binary
redistribution notice, the CLI HTTP parser's MIT terms, and the
public-domain, CC0 and FNV permission statements for the linked hash
implementations. `@php-wasm` retains GPL-2.0-or-later. Linked LGPL, BSD, MIT,
Apache, zlib, public-domain and patent-notice obligations are carried in 42
independently SHA-256-pinned legal files. The builder copies the inventory and
those exact files into the closed pack; `SHA256SUMS` and
`engine-metadata.json` cover them again, but cannot replace the independent
hashes in the verifier lock.
